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
中设置约束。