2011-12-23 101 views
0

我有以下问题:列表不同泛型类型,动态铸造

  • 我需要存储与不同类型的参数,像javish Sth<A,?>通用对象,
  • “?”类型通常是原语,所以不是真正可扩展的/可更换
  • 我需要我的列表中的每个元素上执行一些方法对不同类型的这些方法
    • 不同的方法,或者至少不同的重载

虽然我不知道如何存储这种类型,但为简单起见,我们假设List<object>

我可以将问题的类型存储在某个地方(List<KeyValuePair<Type,object>>),用typeof()获得它,但是,如何才能将对象恢复为所需的类型? 喜欢的东西

foreach(var entry in myList) 
{ 
    var obj = (Sth<A, entry.Key>) entry.Value; 
    myMethod(obj); //This can have overloads for object, Sth<A,int>, Sth<A,string>, 
        // etc. Generally, I need a correct type of obj here. 
} 

当然myMethod<T>是一个通用库方法有太多的过载到的if-else它obj is Sth<A, uint> ...

我想我可以创建基于entry.Key一个新的对象,然后填写

这样的组合类型甚至可能吗?

我相信,答案在于正确创建myList,但我不知道该怎么做。

任何帮助,将不胜感激!

圣诞快乐!:)

+0

'myMethod'做什么?在某些时候,你是否不得不将这个对象转换成有意义的东西来使用它? – 2011-12-23 14:21:43

+0

嗯,这个'myMethod'事实上并不是我的;]问题是我不知道源代码,不能说哪种类型是重要的。 – 2012-01-11 22:26:14

回答

6

如果您正在使用C#4,你可以使用dynamic此:

foreach (KeyValuePair<A, object> entry in myList) 
{ 
    dynamic value = entry.Value; 
    myMethod(value); 
} 

的重载现在将在执行时根据所执行的时间进行类型为value

+0

这样做。感谢您的帮助(对于迟到的回复感到抱歉),这种动态的东西对我来说是新的。但它看起来正是我所期待的。 – 2012-01-11 22:25:03