我有一个具有泛型参数的方法,代码如下所示:
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,
}
通用参数previous
和current
是List<string>
或任何其他类型List
。
问题是我似乎无法在此方法中使用先前的变量值。我无法枚举数据或将其分配给我在本地创建的列表。有没有办法从这些参数中获取数据?
需要有关如何解决此问题的建议。
答案 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
循环访问其元素。这是允许的,因为编译器确定参数previous
是IEnumerable
的实例。
foreach (object dataItem in previous)
{
DoSomething(dataItem);
}
显然,您可能希望将dataItem
转换为适当的内容,但这非常适合您的上下文。
编辑:或者,您可以将元素类型设置为您的类型参数。因此,请在没有where子句的情况下使用class Test<T>
,并将previous
定义为IEnumerable<T>
。
答案 2 :(得分:0)
当您将T
作为参数时,您将其作为单个对象。如果您希望它是Ts的列表,那么您需要将其设为List<T>
。