在字典中使用派生类型参数的函数,以类型作为键

本文关键字:类型 函数 字典 类型参数 派生 | 更新日期: 2023-09-27 18:09:34

我希望能够在字典中存储一个函数,Key是对象类型。所有函数都将接受来自同一基类的对象。我希望能够转换(基于注册函数)一个类到DbCommand。我列出了我的代码下面的形式,似乎是正确的,但有些东西是错误的语法等。我想我错过了一些非常简单的东西……任何帮助将非常感激!

private Dictionary<object, Func<TrackingRecord, DbCommand>> conversionFunctions = new Dictionary<object, Func<TrackingRecord, DbCommand>>();

public void RegisterConversionFunction<T>(Func<T, DbCommand> conversionFunction) where T : TrackingRecord
    {
        conversionFunctions.Add(typeof(T), conversionFunction);
    }
public DbCommand GetConverstion<T>(T trackingRecord) where T : TrackingRecord
    {
        DbCommand command = null;
        if (conversionFunctions.ContainsKey(trackingRecord.GetType()))
        {
            Func<T, DbCommand> conversionFunction;
            if (conversionFunctions.TryGetValue(trackingRecord.GetType(), out conversionFunction))
            {
                command = conversionFunction.Invoke(trackingRecord);
            }
        }
        else
        {
            command = DefaultConversion(trackingRecord);
        }
        return command;
    }

在字典中使用派生类型参数的函数,以类型作为键

您的原始解决方案的问题是方法签名Func<T, DbCommand>与期望值Func<TrackingRecord, DbCommand>不匹配。为了解决这个问题,因为您知道T被限制从TrackingRecord继承,您可以创建一个与预期签名(Func<TrackingRecord, DbCommand>)匹配的包装函数,并将参数强制转换为T。

试试这个:

private Dictionary<object, Func<TrackingRecord, DbCommand>> conversionFunctions = new Dictionary<object, Func<TrackingRecord, DbCommand>>();
public void RegisterConversionFunction<T>(Func<T, DbCommand> conversionFunction) where T : TrackingRecord
{
    conversionFunctions.Add(typeof(T), tr => conversionFunction((T)tr));
}
public DbCommand GetConverstion<T>(T trackingRecord) where T : TrackingRecord
{
    DbCommand command = null;
    Func<TrackingRecord, DbCommand> conversionFunction;
    if (conversionFunctions.TryGetValue(typeof(T), out conversionFunction))
        command = conversionFunction.Invoke(trackingRecord);
    else
        command = DefaultConversion(trackingRecord);
    return command;
}