【问题标题】:Access property by Index按索引访问属性
【发布时间】:2011-12-10 12:07:02
【问题描述】:

我需要通过索引或类似的方式访问属性。原因在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"];
    }
}

【问题讨论】:

  • LINQ 不是依赖项;它是 .Net 3.5 核心的一部分。如果你被困在 .Net 2.0 上,你可以简单地将答案转换为带有字典的几个 foreach 循环。
  • 为什么 LINQ 有问题?它现在已成为多个版本的标准功能,并且是简洁表达想法的强大工具。我 99% 确定您可以采用其他答案并将其展开到其他结构中,但是为什么要麻烦呢?
  • @SLaks:即使您被困在 .NET 2.0 上,您也可以通过 LINQBridge 获得所有 LINQ-to-Objects 优点。
  • 生成的循环将比 LINQ 更丑陋且更难维护。
  • @Joe LINQ 没有问题。只是该解决方案过于冗长,甚至不完整,因为我必须添加其他过滤器。

标签: c# reflection


【解决方案1】:

由于您无法控制类,您可以使用扩展方法和反射通过名称获取属性值:

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();

    }
}

【讨论】:

  • 嗯,扩展反射属性。如果您将该扩展类放在“对象”上,您几乎可以将该属性添加到任何类中,不是吗?
【解决方案2】:

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

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

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

【讨论】:

  • 刚刚添加了 ToString() 方法。这就是我所要求的简单性。
【解决方案3】:

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

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

然后您可以将 myClass 用作集合,因此 myClass["s"] 将返回“某个字符串”。

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

看到这个MSDN article

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 2011-03-03
    • 2016-05-09
    相关资源
    最近更新 更多