根据类型调用重载方法而不检查类型 - c#

时间:2016-11-02 18:31:05

标签: c# methods

我有一个名为BasePaymentTransactionData的类和几个继承它的类。我需要将数据映射到此类的实例,我调用transaction。问题是我必须检查事务是否是特定类型,然后调用相关的重载函数

这是我的代码:

class BasePaymentTransactionData { }

class CreditCardPrimaryRequestData : BasePaymentTransactionData { }

class transaction
{
    CreditCardPrimaryRequestData Map(CreditCardPrimaryRequestData transaction)
    {
         return transaction;
    }

    private BasePaymentTransactionData MapTransactionObject(BasePaymentTransactionData transaction, NameValueCollection parameters, string transactionType, string paymentMethod)
    {
        //BasePaymentMapping

        //Specific Mapping
        if (transaction is CreditCardPrimaryRequestData)
            transaction = Map(transaction as CreditCardPrimaryRequestData);

        // many more derived types ...

        return transaction;
    }
}

我希望有可能做类似

的事情
transaction = Map(transaction)

代码会识别它的类型并将其发送到正确的方法。有没有办法做到这一点,或者我能做的最好?

另外,我知道最好只创建一个接口,并创建一个虚拟的Map()方法,然后调用它,但不幸的是我无法做到这一点,因为我正在处理大量的代码这是框架级别,不是我设计的

1 个答案:

答案 0 :(得分:1)

您可以使用DLR dynamic dispatch功能:

private BasePaymentTransactionData MapTransactionObject(BasePaymentTransactionData transaction, NameValueCollection parameters, string transactionType, string paymentMethod)
{
    transaction = Map((dynamic)transaction);
    return transaction;
}

但请确保除了特定的Map重载之外,您还有类似的内容,否则您将获得例外:

BasePaymentTransactionData Map(BasePaymentTransactionData t)
{
    return t;
}

更好的类型安全方式是实现双重调度(Visitor Pattern),但需要更多编码。