我想我已经很接近解决这个问题了,但我已经有一段时间没有取得进展了,除了四处询问之外别无选择。
我有一个包含大量图形属性的 GraphicsSettings
类。这些属性有一个带有属性名称的占位符值,我将其用于比较循环。
比较循环是类内部的一个函数,位于图形属性数组和遍历外部文本文件中行的Stringreader
之间。
当循环发现图形属性的值与行中的部分内容匹配时,我想将该行的整个值设置到图形属性中。
这就是问题所在,我不知道如何从类中调用属性 setter ,而无需专门输入它的名称,因为它是一个循环,所以我无法这样做。
我尝试过使用:
this.GetType().GetProperty(key).SetValue(this,line, null);
其中“key”是属性名称,“line”是行值。据我了解,当从外部调用类对象来设置值时,这应该可以正常工作,但似乎完全反对使用此方法从内部调用类。
我得到的只是一个
TargetInitationException 未处理
错误。这并不奇怪,但我不知道如何解决这个问题。
所以我想这可以归结为:如何通过使用字符串从属性所在的同一个类中访问属性?
最佳答案
如果属性不是公共(public)的,您可能需要使用绑定(bind)标志,因为 GetProperty
方法不知道您正在从目标类中调用它。 C# 的辅助功能规则适用于静态代码文本,但不适用于此处。
PropertyInfo prop = this.GetType().GetProperty(key, BindingFlags.Instance |
BindingFlags.NonPublic);
prop.SetValue(this, "data", null);
请注意,查找属性区分大小写。因此,您可能还需要包含 IgnoreCase
标志。
PropertyInfo prop = this.GetType().GetProperty(key, BindingFlags.Instance |
BindingFlags.NonPublic |
BindingFlags.IgnoreCase);
prop.SetValue(this, "data", null);
如果您的属性是静态的,则可以指定 BindingFlags.Static
标志,而不是 BindingFlags.Instance
标志。您还可以将两者结合起来以及BindingFlags.NonPublic | BindingFlags.Public
适用于混合情况。
另请注意,类型必须匹配。 C# 的隐式类型转换在这里不起作用。因此,请始终为 SetValue
的值参数(第二个参数)提供正确的类型。例如
string input = "123";
prop.SetValue(this, Int32.Parse(input), null);
int i = 77;
prop.SetValue(this, (double)i, null);
如果属性的类型为 double
,还可以将 int
显式转换为 double
。
Chris Kerekes 建议将 prop.MemberType
与 Convert.ChangeType
结合使用,以获得完全动态的方法,如果您拥有不同类型的属性(至少对于最常见的类型)。
prop.SetValue(this, Convert.ChangeType(line, prop.MemberType), null);
关于c# - 在自己的类中动态设置属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15201661/