接口基类通过generics方法实例化

我有一个界面,例如,为此看起来像这样:

interface IFoo where TEnum : struct, IConvertible, IComparable, IFormattable { TEnum MyEnum { get; set; } } 

然后我有一个抽象的基类,如下所示:

 abstract class FooBase : IFoo where TEnum : struct, IConvertible, IFormattable, IComparable { public TEnum MyEnum { get; set; } } 

然后我inheritance基类,如下所示:

 class MyFoo : FooBase { public enum MyFooEnum { Foo1, Foo2, } } 

如何从类型参数FooBase的generics方法实例化FooBase

我几乎都在寻找这样的东西:

 static class FooMethods { public static TFooClass GetFoo() where TFooClass : FooBase, new() { TFooClass fooclass = new TFooClass(); return fooclass; } } 

FooBase的问题是它需要FooBase类型参数,但实际上我并不关心参数是什么,因为我的MyFoo已经具有那些类型参数。

您可以从公共基础inheritance您的generics类:

 abstract class FooBase { } abstract class FooBase : FooBase, IFoo where TEnum : struct, IConvertible, IFormattable, IComparable { public TEnum MyEnum { get; set; } } public static TFooClass GetFoo() where TFooClass : FooBase, new() { TFooClass fooclass = new TFooClass(); return fooclass; } 

但是您将无法使用MyEnum的通用约束来访问MyEnum属性。 (如果没有指定类型,你怎么能这样?)

那个,或者你需要为GetFoo添加另一个类型参数:

 abstract class FooBase : IFoo where TEnum : struct, IConvertible, IFormattable, IComparable { public TEnum MyEnum { get; set; } } public static TFooClass GetFoo() where TFooClass : FooBase, new() where TEnum : struct, IConvertible, IFormattable, IComparable { TFooClass fooclass = new TFooClass(); return fooclass; } 

更新:我可以指出的另一件事是,如果你发现你需要经常调用这个GetFoo方法,那么如果你把它放在一个实例类而不是静态类中,你可以推送一个或两个类型的参数进入类而不是总是在方法中指定它。 这可以使一些代码不那么冗长,但实际上只有你调用这个方法很多。 例如:

 public sealed FooFactory where TEnum : struct, IConvertible, IFormattable, IComparable { public static TFooClass GetFoo() where TFooClass : FooBase, new() { TFooClass fooclass = new TFooClass(); return fooclass; } } ... var factory = new FooFactory(); var foo1 = factory.GetFoo(); var foo2 = factory.GetFoo(); // or the other way: var factory = new FooFactory(); var foo1 = factory.GetFoo(); var foo2 = factory.GetFoo(); 

你可以做下一个:

 abstract class FooBase { } abstract class FooBase : FooBase, IFoo where TEnum : struct, IConvertible, IFormattable, IComparable { public TEnum MyEnum { get; set; } } static class FooMethods { public static TFooClass GetFoo() where TFooClass : FooBase, new() { TFooClass fooclass = new TFooClass(); return fooclass; } }