在c#中访问泛型类的静态方法

MrL*_*ane 4 c# generics methods inheritance static

我在代码中有以下情况,我怀疑这可能有点过于谨慎:

我有一节课:

abstract class DataAccessBase<T> : IDataAccess where T : AnotherAbstractClass
Run Code Online (Sandbox Code Playgroud)

该类DataAccessBase还有一个静态工厂方法,该方法使用where语句中的枚举值创建自身派生类的实例,以决定要创建的派生类型:

static IDataAccess CreateInstance(TypeToCreateEnum)
Run Code Online (Sandbox Code Playgroud)

现在,派生的类型DataAccessBase<T>本身不是通用的,它们为T指定了一个类型:

class PoLcZoneData : DataAccessBase<PoLcZone> // PoLcZone is derived from AnotherAbstractClass
Run Code Online (Sandbox Code Playgroud)

到目前为止,我不确定这是否正在推动使用泛型的极限,但我真正关心的是如何首先访问静态CreateInstance()方法:

我现在这样做的方法是简单地传递任何类型T,其中T : AnotherAbstractClass. 特别是我自己过去了AnotherAbstractClass.这允许编译很好,但在我看来,将任何类型传递给泛型类只是为了得到静态有点过于愚蠢.

我实际上已经简化了这种情况DataAccessBase<T>,因为继承链中的较低级别,但静态工厂方法存在于中间层,其中类PoLcZoneData是在非泛型的唯一级别上派生的最多.

人们对这种安排的看法是什么?

Mar*_*ell 10

你可以拥有一个同名的非泛型类......也许是这样的:

abstract class DataAccessBase<T> : IDataAccess where T : AnotherAbstractClass
{
    ...
}
static class DataAccessBase
{
    public static IDataAccess CreateInstance(TypeToCreateEnum) {...}
}
Run Code Online (Sandbox Code Playgroud)

现在你可以DataAccessBase.CreateInstance毫无冗余地使用T.通常情况下,你可能会调用internal上的方法DataAccessBase<T>DataAccessBase-虽然我在你的情况下怀疑你可能还需要一点点反射/ MakeGenericType.