2011-04-06 29 views
0

的情况下,在两个班都一样GenericType <的>不分的T我愿做一些东西。这可能吗?的类型GenericType <T>的目标工作,无论牛逼

// class is given; I can't change it!! 
public class MyGeneric<T> : MyBaseClass where T : struct, IComparable, IConvertible 
{ 
    public T MyProperty { get; set; } 
} 


public void DoStuff(MyBaseClass objA, MyBaseClass objB) 
{ 
    ... 
    if (objA.GetType().IsGenericType && objA.GetGenericTypeDefinition() == typeof(MyGeneric<>) && 
      objA.GetType() == objB.GetType()) 
    { 
     //here I know that my objects do have a "MyProperty" 
       //I would like to do something like: 
     if (((MyGeneric<T>)objA).MyProperty.CompareTo(((MyGeneric<T>)objB).MyProperty) > 0) //doesn't work!!!! 
     { 
      //do stuff 
     } 
    } 
} 

回答

0

可以做,如果你改变DoStuff方法签名

public void DoStuff<T>(MyBaseClass objA, MyBaseClass objB) 
    where T : struct, IComparable, IConvertible 
{ 
    // ... 
} 

然而,为了工作,你必须知道的T在编译时的类型,以便调用的方法;我不确定这是否能解决您的问题。

除此之外,其他的解决方案是使用反射:

var valueA = (IComparable)objA.GetType().GetProperty("MyProperty").GetValue(objA, null); 
var valueB = (IComparable)objB.GetType().GetProperty("MyProperty").GetValue(objB, null); 
if (valueA.CompareTo(valueB) > 0) { 
    // ...    
} 
+0

谢谢Jon。我不知道编译时T的类型! – Dunken 2011-04-06 11:12:07

0

这真的没有任何意义:

  1. objA.GetType() == objB.GetType()保证,他们是同一类型的 ,即独立T
  2. 如果点1会被简单地移除这种检查,但ST得到解决生病会比较这些属性是没有意义的,因为两个实例中唯一相同的是属性的名称。 类型可能会有所不同。那应该是什么结果?

如果你真的要比较的属性,只有当T 上是相同的情况下,只要使用这种方法:

public void DoStuff<T>(MyGeneric<T> objA, MyGeneric<T> objB) 
    where T : struct, IComparable, IConvertible 
{ 
    if (objA.MyProperty.CompareTo(objB.MyProperty) > 0) 
    { 
     //do stuff 
    } 
} 

如果你不知道T在编译的时候,你可以像Jon一样使用反射,或者如果你使用的是.NET 4,你可以使用新的dynamic关键字:

public void DoStuff(MyBaseClass objA, MyBaseClass objB) 
{ 
    if (objA.GetType().IsGenericType && 
     objA.GetGenericTypeDefinition() == typeof(MyGeneric<>) && 
     objA.GetType() == objB.GetType() 
     ) 

    { 
     dynamic objADyn = objA; 
     dynamic objBDyn = objB; 
     if (objADyn.MyProperty.CompareTo(objBDyn.MyProperty) > 0) 
     { 
      //do stuff 
     } 
    } 
} 
+0

谢谢丹尼尔。我的意思是类型必须相同,但我不在乎T的类型是什么......我想你的方法可以工作,但是因为我不知道T编译时的类型,我不能使用它。 .. 对? – Dunken 2011-04-06 11:15:48

+0

如果你真的不知道在编译时的类型,你不能使用它,没错。 – 2011-04-06 11:17:41

+0

@ user520094:请检查我的答案更新。这应该对你有所帮助。 – 2011-04-06 11:21:11