c# - 静态方法中的泛型参数正在调用同一个类——有更好的选择吗?

标签 c#

我有一个包含方法的基类。我希望能够使用基类中定义的静态方法从派生类的实例(其中该方法可能被重写)调用该方法。目前我的代码如下所示:

基类

public abstract class BaseClass<T> where T : class, new()
{
    protected BaseClass()
    {

    }

    protected BaseClass(string constructorParam)
    {
        Property = constructorParam;
    }

    protected readonly string Property;

    public virtual void Action(string methodParam)
    {
        //Do some stuff
    }

    public static void DoAction<U>(string constructorParam, string methodParam) where U : BaseClass<T>, new()
    {
        BaseClass<T> myObject = (BaseClass<T>) Activator.CreateInstance(typeof(U), new object[] {constructorParam});
        myObject.Action(methodParam);
    }

派生类

public DerivedClass : Migrater<SomeClass>
{
    public DerivedClass()
    {
    }

    public DerivedClass(string constructorParam) : base(constructorParam)
    {
    }

    public override void Action(string emthodParam)
    {
        //Do some other stuff   
    }
}

这一切都有效,但是当我调用我的 DoAction 方法时,它看起来像这样:

DerivedClass.DoAction<DerivedClass>(someValue, someValue);

在我看来,这看起来丑陋且多余,表明可能有更好的方法。理想情况下,我想要更像这样的东西:

BaseClass.DoAction<DerivedClass>(someValue, someValue);

甚至这样:

DerivedClass.DoAction(someValue, someValue);

无需在派生类中定义任何内容。这可能吗?

最佳答案

您也可以只在类级别定义 U

public abstract class BaseClass<T, U> 
    where T : class, new()
    where U : BaseClass<T, U>, new()
{
    public static void DoAction(string constructorParam, string methodParam)
    {
        BaseClass<T, U> myObject = (BaseClass<T, U>) Activator.CreateInstance(typeof(U), new object[] {constructorParam});
        myObject.Action(methodParam);
    }
}

那么您对派生类的定义将是这样的:

public DerivedClass : Migrater<SomeClass, DerivedClass>
{
}

这样你就可以这样调用它了:

DerivedClass.DoAction(someValue, someValue);

关于c# - 静态方法中的泛型参数正在调用同一个类——有更好的选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48382346/

相关文章:

c# - MonoMac - 链接器中断应用程序

c# - 使用 .NET Core 注册 RabbitMQ 使用者?

c# - 获取返回的 JSON 字符串 C# 的值

c# - <typeparamref> 到 C# XML 文档中另一个类的参数

c# - 如何 : Prevent Timeout When Inspecting Unavailable Network Share - C#

c# - 我应该如何使用C#读取分区表/引导扇区?

C# File.ReadAllText() 在给定目录路径时抛出 "wrong"异常 - 为什么?

c# - 带有 CLR : how to write manifest so runtime files from SxS are used 的 C++ DLL

c# - 如何将 MKL v9.x 静态链接到托管 C++ DLL 中以计算 FFT?

c# - 听wav文件C#