c# - 在自己的类中动态设置属性

标签 c# class dynamic properties

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

我有一个包含大量图形属性的 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.MemberTypeConvert.ChangeType 结合使用,以获得完全动态的方法,如果您拥有不同类型的属性(至少对于最常见的类型)。

prop.SetValue(this, Convert.ChangeType(line, prop.MemberType), null);

关于c# - 在自己的类中动态设置属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15201661/

相关文章:

c# - "Live Charts"图形刷新速度随着数据的处理和添加到 WPF C# 图表而变慢

c++ - 涉及指针和手动实现的矩阵类的问题

javascript - 如何使用 getElementsByClassName 选择具有类的元素并单击它们?

c++ - 是否可以将函数编程到 Qt 的 SLOT() 中用于 QWidget 或应该使用 QSignalMapper?

c# - 使用 GTK 构建 GUI#

c# - 多次枚举的查询结果

python - 一个类和一个函数可以在 Python 中有一个共同的名字吗?

JPA 在运行时动态使用多个数据库模式

javascript - 如何在静态 Javascript 中嵌入 EJS 代码?

c# - 隐藏下拉列表中的项目 - C#