C# 用于映射的字典中的泛型

C# 用于映射的字典中的泛型,c#,generics,mapping,C#,Generics,Mapping,我正在尝试做一些事情,这可能完全是一种倒退。我不知道我是否把自己搞糊涂了,只是需要朝正确的方向踢一脚,或者我需要彻底反思一切 我正在制作一个简单的绘图程序。映射器从一个对象特性映射到另一个对象特性 第一步只是一个简单的字典,可以将一个属性名映射到另一个属性名。但是对于下一个版本,我也需要做一些转换。所以我想我会把地图扩大一点 字典,其中MyMap是一个有两个属性的类。与上面的字符串相对应的字符串,以及作为转换Func的Func。然后,我的代码将查找Func,如果存在,则在将其应用于映射到的对象之

我正在尝试做一些事情,这可能完全是一种倒退。我不知道我是否把自己搞糊涂了,只是需要朝正确的方向踢一脚,或者我需要彻底反思一切

我正在制作一个简单的绘图程序。映射器从一个对象特性映射到另一个对象特性

第一步只是一个简单的字典,可以将一个属性名映射到另一个属性名。但是对于下一个版本,我也需要做一些转换。所以我想我会把地图扩大一点

字典,其中MyMap是一个有两个属性的类。与上面的字符串相对应的字符串,以及作为转换Func的Func。然后,我的代码将查找Func,如果存在,则在将其应用于映射到的对象之前,使用它转换值

我的问题是,如果Func是布尔属性,我希望它将bool作为输入,如果它是字符串属性,则将字符串作为输入。例如:

dictionary.Add("Open", new MyMap {Name = "Closed", Map = Func<bool, bool> {x => !x}};
dictionary.Add("AmountUsd", new MyMap {Name = "AmountEur", Map = Func<decimal, decimal> {x => x * conversionRate}};
dictionary.Add(“Open”,newmymap{Name=“Closed”,Map=Func{x=>!x});
Add(“AmountUsd”,newmymap{Name=“amountur”,Map=Func{x=>x*转换率}};
据我所知,泛型不能这么做。func不能有不同的签名

当然,我可以只使用一个Func,然后在Func中强制转换值,但这并没有那么好

我完全把自己搞糊涂了,还是我使用了另一种方法


谢谢

您需要将类设置为泛型,然后创建一个包含非泛型基类型的字典:

interface IMyMap {
    ...
}
class MyMap<T> : IMyMap {
    public Func<T, T> Map { get; set; }
}

var dict = new Dictionary<string, IMyMap> {
    { "Open", new MyMap<bool> { ... }
};
接口IMyMap{
...
}
类MyMap:IMyMap{
公共函数映射{get;set;}
}
var dict=新字典{
{“打开”,新的MyMap{…}
};

显然,您将无法与字典中的类型参数交互,因为您不知道它是什么类型。

好的……我的问题是,我试图通过添加一些方便的方法与字典中的映射交互。IMyMap接口会是什么样子?接口需要了解泛型类型是吗?还是我不把泛型映射放在接口中?@JayPete:因为你不能有一个非同质泛型类型的字典。你要做的是相当棘手的(如果你想避免装箱),具体取决于您使用类型的方式。我已尝试在不使用Map属性的情况下创建接口IMyMap,然后在需要时将其强制转换为MyMap。但是'var mapper=\u Map[propertyName]as MyMap;'不起作用。例如,如果我硬编码MyMap,它就可以按我所希望的那样工作。所以我只需要弄清楚如何正确地强制转换它。@JayPete:泛型参数必须在编译时已知。无论如何,你都不能用它做任何事情。