2014-04-27 124 views
-2

類型的變量讓我們假設我有這些類使用類型類型爲

Animal 
Cat : Animal 
Dog : Animal 

如果一個方法的地方,我有以下幾點:

Type animalType = someClass.Animal.GetType(); 

我怎麼能投someClass.Animal成任何類型載在animalType之內?喜歡的東西:

var animal = (animalType.Type)someClass.Animal; 
+2

你真的想做什麼?不應該有任何需要這樣做,因爲你無法使用它的方法/屬性 – Sayse

+0

我一直在想這個問題......我仍然認爲這可能是一個有趣的練習。 – PedroC88

+0

這聽起來像你真的想要一個接口或只是更強大的繼承 – Sayse

回答

1

你需要爲這個泛型方法:

public static class Converter 
{ 
    public static T ConvertTo<T>(this object source) where T :class 
    { 
     if (source is T) 
     { 
      return (T) source; 
     } 
     else 
     { 
      return null; // or throw exception 
     } 
    } 
} 

然後你可以使用反射來調用這個方法:

class Animal { } 
class Cat : Animal { } 

class Dog : Animal 
{ 
    public override string ToString() 
    { 
     return "I'm a dog!"; 
    } 

    public bool IsDog { get { return true; } } 
} 

Animal a = new Dog(); 

var methodInfo = typeof (Converter) 
       .GetMethod("ConvertTo", BindingFlags.Static | BindingFlags.Public); 

var method = methodInfo.MakeGenericMethod(a.GetType()); 

var dog = method.Invoke(null, new object[] { a }); 

Console.WriteLine(dog.ToString()); 

在這種情況下,它會寫I'm a dog控制檯。但自從Invoke方法返回一個對象,你不能訪問Dog。爲了做到這一點的方法或屬性,你可以使用動態特點:

dynamic dog = method.Invoke(null, new object[] { a }); 

Console.WriteLine(dog.IsDog); // true 

但隨後就失去了類型 - 安全

因此,如果您不知道要在編譯時間上投下的類型,則無法直接使用類型實例執行此操作。

+0

動態是我過去使用的......這正是我打開這個問題的原因,我在代碼中得到了一點,我知道那裏有什麼一個特定的屬性,但由於接口是通用的,我不能將對象轉換爲特定的泛型類型。 +1爲好解釋雖然:) – PedroC88