2011-06-16 99 views
1

想像這樣接受它應該返回的接口的類型和接口類型的方法 - 是否有可能?

ISomeInterface someVar = creator.Create(typeof(SomeClass), 
             typeof(ISomeInterface)); 

C#代碼應該發生什麼?方法creator.Create需要兩個參數:第一個是要創建的對象的類型,第二個是該方法應該將新創建的對象轉換爲該類型並返回的類型。

所以,像在示例代碼:我們要使用的界面,我們知道類實現,所以我們要求創建對象,並指定返回類型應該是接口,我們感興趣的是

是,甚至有可能實現的。不知何故?基於一些複雜的泛型聲明的泛型,反射,動態方法創建?更復雜的東西?我很樂意提供建議。

當然,我們沒有考慮最簡單的解決方案,即將返回值顯式投射到ISomeInterface。方法應該返回創建的對象作爲我們要求的接口。

如果你想知道什麼,我需要它,我試圖徒勞的追求簡化我的類工廠:)

編輯的一些巧妙的方式複雜化我的工作代碼:

當前通用方法創建:

public T Create<T>(Type type) 
{ 
    return (T)Activator.CreateInstance(type); 
} 

但這不是我想要的是提供兩種類型,基本建立第一個對象,而是作爲第二返回。我沒有在我的代碼庫中實現不同接口的Create方法。

使用的另外的示例:

IFoo f = Create(typeof(Foo), typeof(IFoo)); 
    IBar b = Create(typeof(Bar), typeof(IBar)); 

所以,你可以看到方法根據在第二個參數設置類型返回每個時間不同的接口。而且沒有辦法使用類型約束,或者我不知道如何去做。

+0

請注意,你不當你將一個對象轉換爲一個接口時,不會得到兩個不同的對象,接口只是查看一個對象的另一種方式。換句話說,因爲你的方法不是通用的,所以它將不得不返回'object',所以你可能只需要在方法之外進行轉換。 – 2011-06-16 20:10:32

+0

這就是我所害怕的,但是如果沒有別的方法...... – grapkulec 2011-06-16 20:17:49

+0

你能解釋一下這種方法的用途嗎?我不知道爲什麼要創建一個「A」類型的對象,但是將它返回爲類型「B」。如果方法返回值的接收者是'B'類型,但想要調用'A'類型的方法,那麼只需將其返回到'A'即可...... – 2011-06-16 20:19:45

回答

1

如果你希望你的Create()方法返回ISomeInterface,而無需顯式轉換,那麼你顯然需要使它Create<ISomeInterface>()

要動態構建和傳遞類型的實例,您顯然需要使用反射,但Activator會使它更容易。

+0

顯然,它現在是如何工作的,但我希望擺脫顯式傳遞的接口類型。可能將不得不離開它,直到下一個更好的泛型.Net :) – grapkulec 2011-06-16 20:39:00

+0

我接受這個答案,但因爲它是最接近實際可能的解決方案,但真正的答案是,這種方法是不可能做到今天的C#語法 – grapkulec 2011-06-29 09:29:20

0

這似乎不是一件非常安全的事情。

public TResult CreateToType<TType,TResult>() where TType : new() where TResult : class 
{ 
    return new TType() as TResult; 
} 

編輯 - 嗯,這實際上不會做你想做的,因爲你試圖投射到一個界面。 Woops。

0

您可以使用通用type constraints

public T Create<T,U,V> (U var1, V var2) 
where T: ISomeInterface 
where U: SomeClass 
where V: ISomeInterface 
{ 
//Some code 
} 
+0

我知道類型約束,但不幸的是,這不是我所尋找的 – grapkulec 2011-06-16 20:17:08

+0

這是我見過的最不通用的泛型方法。約束U是一個具體的具體類型有什麼用? :S – 2011-06-16 20:17:21

+0

代替U你可以發送派生自SomeClass的類 – grapkulec 2011-06-16 20:25:13

0

我想你指的是鴨打字,如果它看起來像一隻鴨子則是鴨子!

你應該檢查出其中的一些環節

Wikipedia Duck Typing
Duck Typing Explained

+0

哦,我從來沒有聽說過它,有趣的概念,也許鴨會救我:)但現在我沒有看到一種方式返回問界面。需要仔細閱讀 – grapkulec 2011-06-16 20:30:56

2

了我的頭頂部,你可以做這樣的事情:

 
public I Create<T, I>() where T : I { 
    if(typeof(I).IsInterface) { 
     return Activator.CreateInstance<T>(); 
    } 
    /* Handle non-interface I calls with exception, etc */ 
}