2009-04-20 105 views
0

我想知道是否有可能將一個對象轉換爲類型...我剛開始使用反射,所以也許我做的都錯了,但這裏是我想要做的:鑄造到一個類型

... 
Type type = ...; 
Type interfaceType = someOtherType.GetInterface("IConverter`2"); 

return (Cast to interfaceType)Activator.CreateInstance(type); 

是否可以轉換爲接口?

更新:

編譯器說,T和K可不會被發現。該MyInterface的類型實例知道T和K艙...

public IConverter<T, K> GetConverter(Type type) 
{ 
    if (dtoModelDictionary.ContainsKey(type)) 
    { 
     Type foundType = dtoModelDictionary[type]; 
     Type myInterface = foundType.GetInterface("IConverter`2"); 

     return (IConverter<T, K>)Activator.CreateInstance(foundType); 
    } 
    else if (dalModelDictionary.ContainsKey(type)) 
    { 
     Type foundType = dalModelDictionary[type]; 

     return (IConverter<T, K>)Activator.CreateInstance(foundType); 
    } 
    else 
    { 
     throw new System.Exception(); 
    } 
} 

二更新:

public SomeClass GetConverter(Type type) 
    { 
     if (dtoModelDictionary.ContainsKey(type)) 
     { 
      Type foundType = dtoModelDictionary[type]; 
      Type myInterface = foundType.GetInterface("IConverter`2"); 

      IConverter<T, K> converter = (IConverter<T, K>)Activator.CreateInstance(foundType); 
      return converter.someMethod(); 
     } 
    } 

回答

3

答案給你更新:

您不能轉換爲通用參數未定義的類型。 T和K必須爲使用它的方法定義。

無論其聲明:

public IConverter<T, K> GetConverter<T, K>(Type type) 

或者,如果你經常面對的問題,這個接口被使用,但你不知道任何T或K型,使用接口不使用泛型:

interface IConverter 
{ 
    // general members 
} 

interface IConverter<T, K> : IConverter 
{ 
    // typesave members 
} 

public IConverter GetConverter(Type type) 
{ 
    // ... 
    return (IConverter)Activator.CreateInstance(type); 
} 
1

不是真的,不......至少不會以這種方式。問題是你的返回值必須是你的方法返回值的類型。因爲所有東西都必須在編譯時鍵入,所以對於這種特殊類型的轉換,我可以看到的實際使用情況是有限的或沒有實際情況 - 也許您可以多說一些您正在嘗試完成的內容?

現在,如果你使用的是仿製藥,你有一個運行時打字的故事,你可以回到你的類型參數類型:

public T MyMethod<T>(...) 
... 
return (T)Activator.CreateInstance(type); 
+0

THX,我更新了一些代碼的問題。你的返回值(T)是我的編譯器不喜歡的,因爲它表示類型或名稱空間T無法找到。 – 2009-04-20 07:31:01

1

您只能投一個對象的東西,它實際上是。例如,您可以將String轉換爲IEnumerable,但不能將其轉換爲char[]

如果你的方法返回的實際實現了接口,你可以像往常一樣強制轉換。

例子:

return (IConverter<int,string>)Activator.CreateInstance(type); 

編輯:
你需要做的方法通用的,所以,當你調用它,你可以指定數據類型:

public IConverter<T, K> GetConverter<T, K>(Type type) { 
    ... 
} 
+0

這只是問題所在。我不知道在編譯時什麼T和K會是... – 2009-04-20 07:38:05

+0

如果您在編譯時不知道該類型,那麼您不能聲明一個具有該類型的變量來存儲引用,因此執行強制轉換沒有意義。 – Guffa 2009-04-20 07:55:00

1

你可以這樣做:

var type = typeof(IConverter<,>).MakeGenericType(new Type[] { typeof(T), typeof(K) });