如何在泛型方法中访问对象的属性?
我不能使用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;
}
}
更新:我还需要设置属性
答案 0 :(得分:8)
您有几个选择:
我知道你说你不能做第一个,但它是性能和可维护性的最佳选择,所以在选择其他方法之前请重新考虑是否可能。请记住,即使您无法修改原始代码,您仍然可以选择第一个选项。例如,如果您的类是部分类,则可以在另一个文件中实现该接口:
文件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;
}
}