2

这是我的通用类:

public class MyClass<T>
{
    public T MainModel { get; set; }

    public Type GetType()
    {
        //here
    }
}

然后我用这种形式:

List<MySecondClass> Myinstance = new List<MySecondClass>();

MyClass<IEnumerable<MySecondClass>> mainInstance = new  MyClass<IEnumerable<MySecondClass>> { MainModel = Myinstance  };

所以我需要GetType()返回的方法typeof(MySecondClass)你的建议是什么?

更新

我必须提到,始终MyClass只使用两种形式:第一:我在上面完全编码,第二:

ThirdClass thirdone = new ThirdClass(); 
MyClass<ThirdClass> = new MyClass<ThirdClass>(){ MainModel = thirdone};
4

3 回答 3

6

如果TList<T>

// add error checking to taste
var typeOfEnumerable = typeof(T).GetInterfaces().Where(i => i.IsGenericType)
    .Single(i => i.GetGenericTypeDefinition() == typeof(IEnumerable<>))
    .GetGenericArguments().First();

看到它在行动

如果TIEnumerable<T>

// add error checking to taste
var typeOfEnumerable = typeof(T).GetGenericArguments().First();

重要笔记

您真的应该考虑在MyClass这里尝试做什么。为什么它要T成为一个特殊情况IEnumerable<X>?也许应该添加一些约束T?如果没有更具体的信息,就不可能回答这些和其他重要问题,但您确实应该这样做。

GetType另外,您是偶然还是故意命名该方法?像这样隐藏真的,真的,真的不是一个好主意object.GetType,所以我建议你重命名那个方法。

于 2012-04-18T11:12:19.727 回答
2

编辑:读得太快。对于那个很抱歉。

var t = typeof(T);
if (t.IsGenericType)
{
    return t.GetGenericArguments().FirstOrDefault();
}
于 2012-04-18T11:09:33.220 回答
0

考虑IEnumerable<T>在许多不同的情况下使用它。

例子:

  • MyClass<IEnumerable<MySecondClass>>: 正如你所说,你想要MySecondClass
  • MyClass<List<MySecondClass>>: 你可能想要MySecondClass
  • MyClass<Dictionary<Guid, MySecondClass>>: 还有MySecondClass?或者KeyValuePair<Guid, MySecondClass>
  • MyClass<MyOwnStringList>: MyOwnStringList 将实现IEnumerabl<string>。类本身没有通用参数。有很多这样的例子。
  • MyClass<string>: 你考虑过那个字符串工具IEnumerable<char>吗?
  • 一个类可以实现多个IEnumerable<T>定义。

在考虑了这些情况之后,您必须决定要做什么。

  • 您可以搜索IEnumerable<T>接口并提取通用参数。可能不止一个。字符串可能有一个例外。
  • 您可能会放弃尝试获取IEnumerable<T>通用参数。
  • 您可能只想IEnumerable<T>直接支持(无子类型),例如,IList<T>.
于 2012-04-18T11:51:19.347 回答