2014-04-21 88 views
0

我有一个复杂的问题需要解决。没有泛型比较

我有一个对象列表,虽然后来列表将填充两种不同类型的实例。

第一类是MyFirstType<T1, T2>和第二类是MySecondType<T>

现在我需要,虽然对象列表中运行,并询问这两个一个是每个项目。然后我需要在物品上做一些自定义逻辑。

例如:

foreach(object obj in list) 
{ 
    if(obj is MyFirstType<T1, T2>) 
    { 
    // do something 
    } 
    else if(obj is MySecondType<...>) 
    { 
    } 
} 

的问题是T或T1和T2可以是任何类型的让我怎么写出这样的如果 - 是关键字语句如果MyFirstType但不仿制药里面,只有comparies? if(obj is MyFirstType<T1, T2>)不起作用,因为它需要T1和T2的具体类型。

像刚才提到的那样,只需要比较没有T1和T2。任何想法如何解决这个问题?

+0

http://stackoverflow.com/q/457676 –

+2

这类型检查几乎总是采取错误方法解决问题的产物;你能否抽象一点,详细说明实际的任务是什么以及你如何解决它? –

+0

@AntP谢谢,但不是谢谢问题是我不应该改变我的设计或不。很明显,问题是什么。如果你不能解决这个问题,请不要开始讨论如何/应该如何做对。 –

回答

2

您可以使用属性类的TypeIsGenericType检查obj.GetType()是通用的,然后用GetGenericTypeDefinition获得泛型类型定义,它可以比作typeof(MyFirstType<,>)typeof(MySecondType<>)

foreach(object obj in list) 
{ 
    if(obj.GetType().IsGenericType) 
    { 
     if(obj.GetType().GetGenericTypeDefinition() == typeof(MyFirstType<,>)) 
     { 
      // do something 
     } 
     else if(obj.GetGenericTypeDefinition() == typeof(MySecondType<>)) 
     { 
     } 
    } 
} 
2
  1. 便宜的解决方案:创建一个你在类型中得到的标志接口。这只是帮助确定类型。
  2. 使用反射并检查类型定义并检查类型的名称。
2

为什么不使用多态性?这两种类型使用通用方法实现接口。然后在每种类型的实现中为你需要的方法编写代码。

public interface ICommon 
{ 
    void DoThis(); 
} 

对于MyFirstType和MySecondType你将有:

public class MyFirstType<T> : ICommon 
{ 
    public void DoThis() 
    { 
     //DoThis 
    } 
} 

public class MySecondType<T1,T2> : ICommon 
{ 
    public void DoThis() 
    { 
     //DoThis 
    } 
} 

然后,你可以写下面的foreach循环:

foreach(object obj in list) 
{ 
    obj.DoThis(); 
} 
+1

+1以获得很好的答案,虽然可能是浪费的注意力。 –

+0

我无法更改类型。他们是第三方。他们被密封。无论如何谢谢本。我很欣赏你的建议。 @AntP这不是一个腰杆,但是你的评论已经被拒绝了。你不是说你继续前进吗? –