按索引访问属性

时间:2011-10-18 22:34:15

标签: c# reflection

我需要通过索引或类似的方式访问属性。原因在this already answered question中解释。这个答案使用了Linq,我更喜欢没有依赖性的东西。我无法控制班级。

public class myClass
{
    private string s = "some string";
    public string S
    {
        get { return s; }
    }
}

class Program
{
    static void Main(string[] args)
    {
        myClass c = new myClass();
        // I would like something similar
        // or same functionality
        string s = c["S"];
    }
}

3 个答案:

答案 0 :(得分:6)

由于您无法控制该类,因此您可以使用扩展方法和反射来按名称获取属性值:

static class ObjectExtensions
{
    public static TResult Get<TResult>(this object @this, string propertyName)
    {
        return (TResult)@this.GetType().GetProperty(propertyName).GetValue(@this, null);
    }
}

用法:

class A
{
    public string Z
    {
        get;
        set;
    }

    public int X
    {
        get;
        set;
    }
}

class Program
{
    static void Main(string[] args)
    {
        A obj = new A();
        obj.Z = "aaa";
        obj.X = 15;

        Console.WriteLine(obj.Get<string>("Z"));
        Console.WriteLine(obj.Get<int>("X"));
        Console.ReadLine();

    }
}

答案 1 :(得分:3)

使用(编辑 - 根据评论):

string s = c.GetType().GetProperty ("S").GetGetMethod().Invoke (c, null).ToString();

它为您提供了实例S的名为c的(公共)属性的值,无论c的类型如何,并且根本不使用LINQ,尽管我必须承认我不明白为什么LINQ应该是一个问题...

答案 2 :(得分:0)

您可以通过在类和集合上使用默认属性来实现相同的功能。如果您总是需要字符串,则可以使用Dictionary类作为默认属性。

然后在构造函数中,您可以初始化myDictionary["s"] = "some string";

然后您可以将myClass用作集合,因此myClass [“s”]将返回“some string”。

反射通常表明您没有创建API来完成您需要的工作,如果您要修改代码,那么我建议您使用默认属性。

请参阅此MSDN article