在字典中使用派生类型参数的函数,以类型作为键
本文关键字:类型 函数 字典 类型参数 派生 | 更新日期: 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;
}