2009-02-03 81 views
1

我有一套一些類;這些都是能夠與一個參數是一個特定接口的實例被constructored的。因爲它們都可以由同一個對象構建(並且在所有情況下,這種構造發生的過程基本上都是相同的),所以我認爲模板可能會起作用。基本上,我想要做這樣的事情:C#模板和特殊構造

public static void dostuff<T, U> (List<T> items) 
{ 
    foreach (T item in items) 
    { 
     func(new U(item).SpecialMember); 
    } 
} 

當然,因爲U不會編譯模板是,因此缺乏SpecialMember還有T構造。

基本上,inteface T的任何給定的實施方案具有某些特徵。 UT which has an additional feature that is needed *and* which can be constructed from an any instance of U`的實現。

建議嗎?

回答

4

不幸的是更爲複雜,同時限制將讓你的的方式出現一些,有沒有辦法指定一個類型有一個構造函數,它具有某個參數:您可以要求的唯一構造函數是無參數的構造函數。

個人而言,我希望看到使用"static interfaces"想法(僅可用於類型約束),其變化但目前你會得到最好的是一類工廠或反射 - 或者可能是一個參數的構造函數界面中的「Init」方法。坦率地說,這些都不是很好的選擇。

0

你想要一個Factory模式。將工廠方法添加到返回U類型的T接口。

2

您可以添加constraints到通用參數,這將允許您訪問SpecialMember例如:

public class SpecialObjFactory<T,U> where T : ISpecialMethod 
where u : new() 
{ 
} 
0

不能使用泛型方法創建一個對象。您可以約束的泛型類型,像這樣:

public static void dostuff<T, U> (List<T> items) where T : SomeClass where U : SomethingElse 
{ 
} 

但這隻會讓你訪問這些類/接口,而不是構造函數的成員。

要在喬爾的回答展開,你應該添加一個方法的T接口(在我的例子,SomeClass的),需要一個T類型的對象,並返回一個新的ü對象。像下面這樣:

public class SomeClass  
{ 
    CreateInstanceOfSomethingElse() { return new SomethingElse(this); } 
} 

public static void dostuff<T, U> (List<T> items) where T : SomeClass, U : SomethingElse 
{ 
    foreach (T item in items) 
    { 
     func(item.CreateInstanceOfSomethingElse().SpecialMember); 
    } 

} 

作爲另一個完全不同的方法,你可以指定該doStuff方法採用Func<T, U>爲好,這是應該從T對象創建U形。

public static void dostuff<T, U> (List<T> items, Func<T, U> createU) 
{ 
    foreach (T item in items) 
    { 
     func(createU(item).SpecialMember); 
    } 

} 

這就會變得混亂,如果你的對象的創建是什麼,不是一個簡單的蘭巴像

t => new U(t)

0
public static void dostuff<T, U> (List<T> items) 
{ 
    foreach (T item in items) 
    { 
     U obj = (U)System.Activator.CreateInstance(typeof(U), item); 
     func(obj.SpecialMember); 
    } 
}