我有一组配置对象,其构造函数都采用相同的参数。是否可以将构造函数分配给Func或类似的东西,以便可以通用方式调用构造函数?
例如:
public class FooConfig : ConfigBase {
public FooConfig(int a) { ... }
}
public class BarConfig : ConfigBase {
public BarConfig(int a) { ... }
}
在调用代码时:
Func<int, ConfigBase> fooConfigCtr = FooConfig.FooConfig; // Obviously this doesn't work
FooConfig fooConfig = (FooConfig) fooConfigCtr(12345);
调用代码示例不是为了显示实际用途,而是为了说明为什么我在这种情况下使用Func有困难。
我找到的解决方法是在每个具有相同签名的类上提供静态Factory方法,并将该方法调用为私有构造函数。然而,它略微不是最佳的。
答案 0 :(得分:2)
您不必提供静态工厂方法。它可能不是您想要的,但您可以使用lambda expression,如下所示:
Func<int, ConfigBase> fooConfigCtr = n => new FooConfig(n);
答案 1 :(得分:0)
试试这个:
Func<int, ConfigBase> fooConfigCtr = a => new FooConfig(a);
FooConfig fooConfig = (FooConfig)fooConfigCtr(12345);
如果没有lambda表达式,您可以尝试使用Activator。
Type typeOfYourClass = typeof (FooConfig);
FooConfig fooConfig = (FooConfig)Activator.CreateInstance(typeOfYourClass, 12345);
答案 2 :(得分:0)
如果你需要一种更有活力的方式,你可以这样做:
Func<int,ConfigBase> GetFactoryFunction(Type t)
{
if(t == null) throw new ArgumentNullException("t");
if(!typeof(ConfigBase).IsAssignableFrom(t)) throw new ArgumentException();
return i => (ConfigBase)Activator.CreateInstance(t,i);
}
甚至是通用的:
Func<int,TDerived> GetFactoryFunction<TDerived>() where TDerived : ConfigBase
{
return i => (TDerived)Activator.CreateInstance(typeof(TDerived),i);
}