通用参数列表

时间:2015-04-28 15:15:51

标签: c# list generics arguments

我有一个具有泛型参数的方法,代码如下所示:

public Result[] Compare(PropertyInfo property, T previous, T current)
{
    var type = previous.GetType().GetGenericArguments()[0];
    var listType = typeof(List<>);
    var constructedListType = listType.MakeGenericType(type);
    var instance = (IList)Activator.CreateInstance(constructedListType);

    instance = previous //throws compile error obviously,
}

通用参数previouscurrentList<string>或任何其他类型List

问题是我似乎无法在此方法中使用先前的变量值。我无法枚举数据或将其分配给我在本地创建的列表。有没有办法从这些参数中获取数据?

需要有关如何解决此问题的建议。

3 个答案:

答案 0 :(得分:1)

你做得太复杂了。只需使用List<T>IList<T>类型的参数即可。如果您不需要列表索引,但需要添加或删除元素,则还可以将参数键入ICollection<T>。如果您只需要枚举集合,请将其键入IEnumerable<T>。这允许您将更多类型传递给您的方法。

您还可以使用以下命令创建新列表:

var newList = new List<T>();

你可以用:

创建一个新的T实例
T item = new T();

但是,如果要执行此操作,则必须包含此泛型类型参数的new约束:

public class MyClass<T> : where T : new
{
    ...
}
然后

T必须有一个默认构造函数,即一个带有空参数列表的构造函数。

但是,你的问题并不清楚,你想要达到的目标。

也许你只是在寻找这个:

var result = myList
    .Where(x => x.SomeProperty.Equals(someValue));

或者,如果要查找的属性可以动态选择

public IEnumerable<T> Filter(Func<T, object> getProperty, IEnumerable<T> coll,
    object value)
{
    return coll
        .Where(x => getProp(x).Equals(value));
}

像这样称呼

var result = Filter(x => x.SomeProperty, myList, someValue);

答案 1 :(得分:0)

如果T是IEnumerable,则可以使用foreach循环访问其元素。这是允许的,因为编译器确定参数previousIEnumerable的实例。

foreach (object dataItem in previous)
{
    DoSomething(dataItem);
}

显然,您可能希望将dataItem转换为适当的内容,但这非常适合您的上下文。

编辑:或者,您可以将元素类型设置为您的类型参数。因此,请在没有where子句的情况下使用class Test<T>,并将previous定义为IEnumerable<T>

答案 2 :(得分:0)

当您将T作为参数时,您将其作为单个对象。如果您希望它是Ts的列表,那么您需要将其设为List<T>