C#构造函数为Func(无反射)

时间:2014-05-23 18:22:26

标签: c# reflection function-pointers func

我有一组配置对象,其构造函数都采用相同的参数。是否可以将构造函数分配给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方法,并将该方法调用为私有构造函数。然而,它略微不是最佳的。

3 个答案:

答案 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);
}