C#确定泛型类型
我有几个模板化对象,它们都实现了相同的接口: 即C#确定泛型类型,c#,generics,reflection,types,C#,Generics,Reflection,Types,我有几个模板化对象,它们都实现了相同的接口: 即 MyObject对象j1; MyObject obj2; myobjectobj3; 我想将这些对象存储在列表中。。。我想我会这样做: private List<MyObject<object>> _myList; public interface IMyObject { Type DataType { get; } } public class MyObject<T> : IMyObject&l
MyObject对象j1;
MyObject obj2;
myobjectobj3;
我想将这些对象存储在列表中。。。我想我会这样做:
private List<MyObject<object>> _myList;
public interface IMyObject {
Type DataType { get; }
}
public class MyObject<T> : IMyObject<T>, IMyObject {
public Type DataType {
get { return typeof(T); }
}
}
public static bool Exist<T>(this IEnumerable source, Type type) {
return source.OfType<IMyObject>().Any(x => x.DataType.Equals(type));
}
private List\u myList;
然后我想创建一个函数,该函数接受一个参数,即数据类型,以查看我的列表中是否存在使用该数据类型的对象。。。。有点不知道该怎么做。在伪代码中,它将是:
public bool Exist(DataType T)
{
return (does _myList contain a MyObject<T>?);
}
public bool Exist(数据类型T)
{
return(myList是否包含MyObject?);
}
一些澄清……
我的界面是
IMyObject
,我的对象是MyObject
。我有一个新类MyObjectManager
,我需要在其中存储一个MyObject
列表。我需要一个函数来检查列表中是否存在MyObject
。类型T
是使用T4自动生成的数据类型。。。。我的实体数据模型中的POCO类。您可以创建一个通用函数:
public bool Exists<T>() where T : class {
return _myList.OfType<MyObject<T>>().Any();
}
但是,请注意,列表
不能容纳MyObject
您需要将列表更改为
列表
,或使MyObject
实现或继承非泛型类型,并使列表包含该类型。因为它们都实现相同的接口,而不是将它们强制转换为object并调用GetType(这可能很昂贵),为什么不向接口添加一个名为class name的属性呢(或其他什么)?然后您可以使用linq来获取该属性。不要忘记使用System.linq
using System.Linq;
public bool Exist(List<IMyInterface> objects, IMyInterface typeToCheck)
{
return objects.Any(t => t.ObjectName == typeToCheck.ObjectName);
}
使用System.Linq;
public bool Exist(列出对象,imy接口类型检查)
{
返回objects.Any(t=>t.ObjectName==typeToCheck.ObjectName);
}
扩展方法如何
public static bool HasAny(this IEnumerable source, Type type) {
foreach (object item in source)
if (item != null && item.GetType().Equals(type))
return true;
return false;
}
用法:
bool hasDataType1 = myList.HasAny(typeof(MyObject<datatype1>));
另外,SLaks是正确的,除了类型为MyObject
的对象或某个派生类(和MyObject
等)的对象之外,您真的不能有一个列表
,该列表中包含任何内容
另一种方法是,我建议您解决“使用系统无法获取泛型类的类型。如果不使用反射,则无法获取类型对象”的问题:使您的MyObject
实现一个非泛型接口,如下所示:
private List<MyObject<object>> _myList;
public interface IMyObject {
Type DataType { get; }
}
public class MyObject<T> : IMyObject<T>, IMyObject {
public Type DataType {
get { return typeof(T); }
}
}
public static bool Exist<T>(this IEnumerable source, Type type) {
return source.OfType<IMyObject>().Any(x => x.DataType.Equals(type));
}
如果它包含一个MyObject
和U
继承T
?那么我的U是使用T4和EF POCO类自动生成的。这些类是否相互继承?否,默认情况下它们不继承任何内容。我的接口是imyinterface。存储列表的我的类没有泛型类型,但是MyObject中的T是已知的在编译时,这些对象的名称空间在此类中被引用。当我尝试第一个示例时,它说类型T必须是引用类型才能将其用作参数。我希望T是泛型类型,这样我就可以传入任何数据类型,无论是int、string等。您需要添加一个where T:class
contstraint来在MyObject
中设置约束。