2

我想我已经很接近解决这个问题了,但是我已经有一段时间没有取得进展了,除了四处打听之外别无选择。

我有一个GraphicsSettings具有大量图形属性的类。这些属性有一个带有属性名称的占位符值,我将其用于比较循环。

比较循环是类内部的一个函数,位于图形属性数组和Stringreader外部文本文件中的遍历行之间。

当循环找到图形属性的值与行中的一部分内容之间的匹配时,我想将行的整个值设置到图形属性中。

这是问题所在,我不知道如何从类中调用属性设置器而不专门输入它的名称,因为它是一个循环,所以我不能这样做。

我试过使用:

this.GetType().GetProperty(key).SetValue(this,line, null);

其中“key”是属性名称,“line”是行值。据我了解,这在从外部调用类对象来设置值时应该可以正常工作,但似乎完全反对使用这种方法从内部调用类。

我得到的只是一个 TargetInvocationException was unhandled错误。并不奇怪,但我不知道如何解决这个问题。

所以我想它归结为:我如何通过使用字符串从属性所在的同一个类中访问属性?

4

1 回答 1

4

如果属性不是公共的,您可能需要使用绑定标志,因为该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);

如果属性的类型为 ,也将 an显式转换int为 a 。doubledouble


Chris Kerekes 建议prop.MemberType结合使用Convert.ChangeType来获得一种完全动态的方法,如果您有不同类型的属性(至少对于最常见的类型),该方法将起作用。

prop.SetValue(this, Convert.ChangeType(line, prop.MemberType), null);
于 2013-03-04T13:02:40.353 回答