【问题标题】:Accessing property through string name [duplicate]通过字符串名称访问属性[重复]
【发布时间】:2012-10-08 17:10:13
【问题描述】:

可能重复:
How to set object property through Reflection

如果我有以下程序:

public class MyClass
{
    public int MyIntProp {
        get;
        set;
    }
    public string MyStringProp {
        get;
        set;
    }
}

public class MyMainClass
{
    private const string PropertyName = "MyIntProp";
    private MyClass _myClass;

    public MyMainClass()
    {
        _myClass = new MyClass();
        // _myClass.PropertyName = 5;
    }
}

我想要做的是能够将5 的值分配给MyIntProp 属性。是否可以使用字符串名称来执行此操作?我虽然在使用 LINQ 之前看到过类似的事情,但我似乎不记得语法或在哪里找到它。

【问题讨论】:

  • 您可能不想这样做。很可能有更好的方法来解决您的问题。反思是一把大锤;不要用它来拍打苍蝇。
  • 这里有一些与 LINQ 类似的东西(可能是你所指的),供参考:weblogs.asp.net/scottgu/archive/2008/01/07/…
  • 我同意@Servy。至少从你的例子来看,你绝对应该只做_myClass.MyIntProp = 5;

标签: c# properties


【解决方案1】:

您可以将反射与GetProperty 方法一起使用:

 typeof(MyClass).GetProperty(PropertyName).SetValue(_myClass, 5);

【讨论】:

  • 使用反射的唯一问题是,如果使用自动 getter 和 setter,属性名称不会改变吗?我想说它在名称上附加了BackingField 或类似的东西?
  • @icemanind 但是您并没有尝试直接访问支持字段,您只是尝试访问该属性。看看方法;这是GetProperty。它专门设计用于获取一个属性
  • @icemanind:嗯,随着属性名称自动更改,我想需要有机制来获取正确的名称,您能否修改问题以加深理解?
  • @CuongLe:不,没关系。服务是正确的,您的解决方案将起作用,因为我正在尝试获取属性而不是支持字段:)​​
  • 我正在查看this Stackoverflow Question,我看到接受的答案是将k__BackingField 附加到属性名称。我错过了他询问私有支持字段名称的部分。
猜你喜欢
  • 2016-07-30
  • 1970-01-01
  • 2016-01-31
  • 2012-05-04
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 2022-07-22
相关资源
最近更新 更多