gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:59:59 24 4
gpt4 key购买 nike

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

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

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

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

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

我试过使用:

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

其中“key”是属性名,“line”是行值。据我了解,当从外部调用类对象设置值时,这应该工作得很好,但它似乎完全反对使用此方法从内部调用类。

我得到的只是一个 TargetInvocationException 未处理 错误。不足为奇,但我不知道如何解决这个问题。

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

最佳答案

如果属性不是公共(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com