一个优雅的方式来做到这一点?可能是泛型?

Kai*_*kus 1 c# generics

我有两个派生类(Sale和ServiceCharge).两者都是交易.如果我有BusinessService,我想为它创建一个ServiceCharge.如果我传递产品,我想实例化Sale.

这是我的想法.

private void CreateInstance(object element)
{
    Transaction transaction;
    if (element.GetType() == typeof(BussinessService))
    {
        transaction = new ServiceCharge((BussinessService)element))
    }
    else
    {
        transaction = new Sale((Product)element);
    }
{
Run Code Online (Sandbox Code Playgroud)

你能告诉我一个更优雅的方式吗?我会知道如何只用一个构造函数来使用泛型

private void CreateInstance<T>(T element)
{
   Transaction transaction = new Transaction((T)element);
}
Run Code Online (Sandbox Code Playgroud)

但我不知道如何处理第一个案例.

p.s*_*w.g 6

定义这样的通用接口:

public interface ITransactionable<T>
    where T : Transaction
{
    T CreateTransaction();
}
Run Code Online (Sandbox Code Playgroud)

装饰你的BussinessServiceProduct:

public class BussinessService :
    ITransactionable<ServiceCharge>
{
    public T CreateTransaction() 
    { 
        return new ServiceCharge(this);
    }
}

public class Product :
    ITransactionable<Sale>
{
    public T CreateTransaction() 
    { 
        return new Sale(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您的泛型方法可以定义为:

private void CreateInstance<T>(ITransactionable<T> element)
{
   Transaction transaction = element.CreateTransaction();
   ...
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*ove 6

在这种情况下,只是一个简单的界面也可以工作:

interface ITransactionable
{
    Transaction CreateTransaction();
}

class BusinessService : ITransactionable
{
    public Transaction CreateTransaction() { return new ServiceCharge( this ); }
}

class Product : ITransactionable
{
    public Transaction CreateTransaction() { return new Sale( this ); }
}
Run Code Online (Sandbox Code Playgroud)
private void CreateInstance(ITransactionable element)
{
   Transaction transaction = element.CreateTransaction();
   ...
}   
Run Code Online (Sandbox Code Playgroud)