c# – 派生功能的增强基类方法 – 减少代码

典型情况如下.

class ServiceBase
{
    public virtual InstanceBase Getobject() { return null; }
}

class ServiceA : ServiceBase
{
    public override InstanceBase Getobject()
    {
        var v = new InstanceA();
        v.Method();
        return v;
    }
}

class ServiceB : ServiceBase
{
    public override InstanceBase Getobject()
    {
        var v = new InstanceB();
        v.Method();
        return v;
    }
}

class InstanceBase
{
    public virtual void Method() { }
}

class InstanceA : InstanceBase
{
    public override void Method(){}
}

class InstanceB : InstanceBase
{
    public override void Method() { }
}

不同的服务处理不同的实例类.但是Getobject的代码对于所有服务都是类似的.我想通过扩展基类的执行最多的Getobject方法来减少代码库.

class ServiceBase
{
     public virtual InstanceBase Getobject<T>()
     {
         var v= (InstanceBase)Activator.CreateInstance(typeof(T),new object[] { });
         v.Method();
         return v;
     }
}

这似乎是一种实现方式.但是我不太担心使用反射,因为它可能会遇到性能问题.有没有更好的方法来实现这一目标?

解决方法

是的,有两种方法

1)通用方法

class ServiceBase<T> where T : InstanceBase,new()
{
    public InstanceBase Getobject() //you can make the return type even 'T'
    {
        var v = new T();
        v.Method();
        return v;
    }
}

class ServiceA : ServiceBase<InstanceA> 
{

}

class ServiceB : ServiceBase<InstanceB> 
{

}

这只是更好,因为它具有最少的代码重复,但我不确定通用性是否会成为一个麻烦.

2)如果不适合,您可以要求基类提供自己的InstanceBase.这看起来更简洁.喜欢:

abstract class ServiceBase
{
    public abstract InstanceBase Instance { get; }

    public InstanceBase Getobject() //you can make the return type even 'T'
    {
        Instance.Method();
        return Instance;
    }
}

class ServiceA : ServiceBase 
{
    public override InstanceBase Instance { get; } //return new InstanceA() here
}

class ServiceB : ServiceBase
{
    public override InstanceBase Instance { get; } //return new InstanceB() here
}

现在,从重写的属性Instance返回InstanceBase的新实例或已经实例化的实例.这取决于你的逻辑,但是从所显示方法来看,你每次都必须返回一个新实例.

哪个适合你取决于你的背景.无论是什么,请考虑:

1)这种方法很糟糕.

public virtual InstanceBase Getobject<T>()
 {
     var v= (InstanceBase)Activator.CreateInstance(typeof(T),new object[] { });
     v.Method();
     return v;
 }

首先,你必须在调用函数时指定类型参数,其中两个,每个人都有可能搞砸了.

ServiceA a = new ServiceA();
a.Getobject<InstanceB>(); // not probably what you want.

2)在任何情况下,如果你想要它,你可以为泛型类型参数T赋予new()约束.

3)如果要使用认构造函数进行实例化,则无需指定空参数集合.这样做:

var v= (InstanceBase)Activator.CreateInstance(typeof(T));
// or just new T();

4)您似乎没有在Getobject方法中使用任何实例成员.如果是这种情况,那么您可以使用静态方法.这应该是静态的还是非静态的,取决于您想要进行的调用.请记住静电.

public static InstanceBase Getobject() //you can make the return type even 'T'
{
    var v = new T();
    v.Method();
    return v;
}

//can call like this too:
ServiceA.Getobject(); //etc

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...