在泛型方法中访问对象的属性

时间:2011-01-23 07:57:02

标签: c#

如何在泛型方法中访问对象的属性?
我不能使用where T: A,因为此方法将接收不同的对象,但所有对象都有一个共同的属性可供使用 (我也不能为他们制作一个通用界面)

public class A
{
    public int Number {get;set;}
}


List<A> listA = new List<A>{
                new A {Number =4},
                new A {Number =1},
                new A {Number =5}
};

Work<A>(listA);

public static void Work<T>(List<T> list1)
{
    foreach(T item in list1)
    {
        do something with item.Number;
    }
}

更新:我还需要设置属性

2 个答案:

答案 0 :(得分:8)

您有几个选择:

  • 建立一个通用界面。
  • 使用反射。
  • 在.NET 4中使用动态类型。

我知道你说你不能做第一个,但它是性能和可维护性的最佳选择,所以在选择其他方法之前请重新考虑是否可能。请记住,即使您无法修改原始代码,您仍然可以选择第一个选项。例如,如果您的类是部分类,则可以在另一个文件中实现该接口:

文件1:

// Automatically generated code that you can't change.
partial class A
{
    public int Number { get; set; }
}

文件2:

interface IHasNumber
{
    int Number { get; set; }
}

partial class A : IHasNumber
{
}

如果原始类未定义为partial,则可以围绕它们编写实现接口的包装类。

拥有通用界面后,您可以更改通用约束以要求此界面:

where T : IHasNumber

答案 1 :(得分:1)

如果您不需要列表 - 只需要项目,我会在外面使用投影方法:

static void Main()
{
    List<A> listA = new List<A>{
            new A {Number =4},
            new A {Number =1},
            new A {Number =5}
    };

    Work(listA.Select(a => a.Number));

}
public static void Work(IEnumerable<int> items)
{
    foreach (number item in items)
    {
        // do something with number;
    }
}

如果您需要列表 - 通过选择器在内部投影

static void Main()
{
    List<A> listA = new List<A>{
            new A {Number =4},
            new A {Number =1},
            new A {Number =5}
    };

    Work(listA, a => a.Number);

}
public static void Work<T>(IList<T> list, Func<T, int> selector)
{
    foreach (T obj in list)
    {
        int number = selector(obj);
        // do something with number;
    }
}