2009-02-03 80 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); 
    } 
}