如何遍历通用参数方法?
我有一个使用通用方法的集合。
public void DoSomething<T>(List<T> input)
{
// I want to foreach
foreach (var v in input)
{
byte[] data = v.Data;
string name = v.Name;
}
}
我的问题是:我没有在V.中获得数据和名称。如何实现
答案 0 :(得分:4)
您可以让所有通用输入实现一个Interface,该Interface公开您需要的属性。然后,您需要对通用T
施加约束,以利用这些属性:
void Main()
{
var list = new List<RandomData>();
DoSomething(list);
}
public void DoSomething<T>(List<T> input) where T : IData
{
foreach(var v in input)
{
byte[] data = v.Data;
string name = v.Name;
}
}
public interface IData
{
byte[] Data { get; set; }
string Name { get; set; }
}
class RandomData : IData
{
public byte[] Data { get; set; }
public string Name { get; set; }
}
答案 1 :(得分:0)
您要实现的目标是创建一个通用方法,该方法可对某些特定类型进行迭代以执行某些特殊操作,在这种情况下,这是由于共有的共同行为,因此在创建泛型时没有附加值如果特定成员之间没有共同之处,则该方法将迭代特定成员以执行某些操作,因此在您的情况下,您可以在通用类型上设置条件以实现接口:
public void DoSomething<T>(List<T> input) where T : ICommonLogic
{
foreach(var v in input)
{
byte[] data = v.Data;
string name = v.Name;
}
}
或者通过添加扩展名更干净:
public static class CommonLogicExtensions
{
public static DoSomething(this IEnumerable<ICommonLogic> input)
{
foreach(var v in input)
{
byte[] data = v.Data;
string name = v.Name;
}
}
}
泛型的用法有些不同,例如,创建一个采用诸如List
之类的不同类型对象的数据结构,但是当涉及到特定或特殊行为时,应改用通用接口。