C#EMIT IL用于多值泛型类?

时间:2016-04-20 23:33:02

标签: c# .net compiler-construction

我正在做一个运行时/反射/发射类型的过程。我有它工作,所以我理解基础知识。我需要扩展它以支持字典,但是希望它足够通用以扩展到其他多值泛型类。我的想法是将一个字典复制到另一个字典,但我需要预先获取/插入项目,因为它们可能需要一路上操作...

Dictionary<int, string>KeyValuePair<int, string>的ICollection。

所以,如果我在字典上做GetGenericArguments,我得到:

int
string

真棒。那么,我怎么知道int属性与Key和字符串绑定绑定到Value?

让我们说它是Tuple<T1, T2, T3>,我有同样的问题,必须知道T1是Item1,T2是Item3等。

我考虑反思KeyValuePair<int, string> GetProperties(),然后我得到int Key,string Value,但是我必须保证Key是第一个参数,Value是第二个... .NET在这方面起作用,因为像KeyValuePair / Tuple这样的类保持属性的顺序相同。

.Net还保持params顺序...在一个元组中,例如T1,T2,T3,构造函数的参数是item1,item2,item3,属性名是Item1,Item2,Item3,所以你可以将所有东西捆绑在一起......但这无法保证。

理论上,源/目标必须是相同的内部类型,即KeyValuePair'2到KeyValuePair'2,但它理论上也可以是int,int和int,string,因为int是“可转换”到字符串。

你们明白我的意思吗?有什么想法吗?

编辑:

动态生成的Emit代码基本上需要:

foreach (KeyValuePair<int, int> kvp in sourceDict)
{
   destDict.Add(kvp.Key, kvp.Value);
}

我试图避免“了解字典”,但根据你的回答,这似乎是不可避免的?

让我们说Bob为所有操作发明了一个新的字典,例如O(0.000000001)LOL,所以每个人都切换到该实现,现在复制字典的C#代码将是:

foreach (BobKeyValuePair<int, int> kvp in sourceDict)
{
   destDict.Add(kvp.bKey, kvp.aValue);
}

或者其他什么,因为Bob只擅长优化,但不能正确命名。所以现在我必须知道Key / Value和bKey / aValue,这是我想要避免的。

从理论上讲,Dictionary<int, int>是“可投递”到我的应用中的List<Tuple<int, int>> ...我猜这不可能以通用的方式实现。

0 个答案:

没有答案