您可以从公共基础继承泛型类:
abstract class FooBase {
}
abstract class FooBase<TEnum> : FooBase, IFoo<TEnum>
where TEnum : struct, IConvertible, IFormattable, IComparable {
public TEnum MyEnum { get; set; }
}
public static TFooClass GetFoo<TFooClass>()
where TFooClass : FooBase, new() {
TFooClass fooclass = new TFooClass();
return fooclass;
}
但您将无法访问MyEnum
具有一般约束的属性FooBase
。 (如果没有指定类型,你怎么能这么做呢?)
那,或者你需要添加另一个类型参数GetFoo
:
abstract class FooBase<TEnum> : IFoo<TEnum>
where TEnum : struct, IConvertible, IFormattable, IComparable {
public TEnum MyEnum { get; set; }
}
public static TFooClass GetFoo<TFooClass, TEnum>()
where TFooClass : FooBase<TEnum>, new()
where TEnum : struct, IConvertible, IFormattable, IComparable {
TFooClass fooclass = new TFooClass();
return fooclass;
}
更新:我可以指出的另一件事是,如果您发现需要调用此GetFoo
方法很多,那么如果将其放入实例类而不是静态类中,则可以将一个或两个类型参数推入类中,而不是始终在方法中指定它。这可以使某些代码变得不那么冗长,但实际上只有当您经常调用此方法时。前任:
public sealed FooFactory<TEnum>
where TEnum : struct, IConvertible, IFormattable, IComparable {
public static TFooClass GetFoo<TFooClass>()
where TFooClass : FooBase<TEnum>, new() {
TFooClass fooclass = new TFooClass();
return fooclass;
}
}
...
var factory = new FooFactory<SomeEnum>();
var foo1 = factory.GetFoo<SomeFooClass1>();
var foo2 = factory.GetFoo<SomeFooClass2>();
// or the other way:
var factory = new FooFactory<SomeFooClass>();
var foo1 = factory.GetFoo<SomeEnum1>();
var foo2 = factory.GetFoo<SomeEnum2>();