是否可以在通用方法中使用其内部构造函数构造对象?

public abstract class FooBase { }

public class Foo : FooBase {
   internal Foo() { }
}

public static class FooFactory {
    public static TFooResult CreateFoo<TFooResult>()
    where TFooResult : FooBase, new() {
        return new TFooResult();
    }
}

FooFactoryFoo. 。类似这样称呼工厂方法:

var foo = FooFactory.CreateFoo<Foo>();

他们获得编译时间错误:

“ foo”必须是具有公共参数构造函数的非摘要类型,以便将其用作通用类型或方法“ foofactory.createfoo()'的参数'tfootype'

有什么方法可以解决吗?

我也尝试了:

Activator.CreateInstance<TFooResult>(); 

这在运行时会引起相同的错误。

有帮助吗?

解决方案

您可以删除 new() 约束和返回:

//uses overload with non-public set to true
(TFooResult) Activator.CreateInstance(typeof(TFooResult), true); 

尽管客户也可以这样做。但是,这很容易出现运行时错误。

这是一个很难以安全的方式解决的问题,因为该语言不允许抽象的构造函数Declaraton。

其他提示

类型参数必须有一个 上市 无参数构造函数。与其他约束一起使用时,必须最后指定新的()约束。

http://msdn.microsoft.com/en-us/library/d5x73970.aspx

编辑:所以不,如果使用new()约束,则不能通过该类,如果不使用new()约束,则可以尝试使用反射来创建新实例

public static TFooResult CreateFoo<TFooResult>()
where TFooResult : FooBase//, new()
        {
            return (TFooResult)typeof(TFooResult).GetConstructor(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance, null, new Type[] {}, null).Invoke(new object[]{});
            //return new TFooResult();
        }

如下所示,很少有工作能力,但我认为您不想那样!

  • 将开关语句放入工厂内,该语句将基于类型参数的类型创建实例。

  • Foobase的每个具体实现都将使用Foofactory通过工厂方法进行注册以创建自我。因此,小曲act将使用内部字典

  • 在类似行上扩展,除了类型参数和具体实现之间的映射外,将是外部代码(XML文件,配置等)。 IOC/DI容器也可以在这里提供帮助。

public class GenericFactory
{
    public static T Create<T>(object[] args)
    {
        var types = new Type[args.Length];
        for (var i = 0; i < args.Length; i++)
            types[i] = args[i].GetType();

        return (T)typeof(T).GetConstructor(types).Invoke(args);
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top