Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何发现C#indexer中使用的键?_C#_.net_Reflection - Fatal编程技术网

如何发现C#indexer中使用的键?

如何发现C#indexer中使用的键?,c#,.net,reflection,C#,.net,Reflection,我们有一个遗留类,它使用索引器允许用户添加任意键值对: legacyInstance["myKey"] = value; 遗憾的是,我们无法查看或修改此类的代码。我们只能通过它的各种属性来访问它 我们需要做的是以一种智能的方式克隆这个对象。当然,普通属性很容易克隆: myClone.blargle = legacyInstance.blargle; 但是,我们如何发现可能有人添加到特定对象实例中的所有密钥,以便正确克隆它们呢?理想情况下是这样的: string[] keys = legacy

我们有一个遗留类,它使用索引器允许用户添加任意键值对:

legacyInstance["myKey"] = value;
遗憾的是,我们无法查看或修改此类的代码。我们只能通过它的各种属性来访问它

我们需要做的是以一种智能的方式克隆这个对象。当然,普通属性很容易克隆:

myClone.blargle = legacyInstance.blargle;
但是,我们如何发现可能有人添加到特定对象实例中的所有密钥,以便正确克隆它们呢?理想情况下是这样的:

string[] keys = legacyInstance.<#magic!#>;
foreach (string key in keys)
{
    myClone[key] = legacyInstance[key];
}
string[]keys=legacyInstance。;
foreach(字符串键入键)
{
myClone[key]=legacyInstance[key];
}

虽然我怀疑魔法可能涉及到一些反射,但事实证明很难做到这一点,因为我是一个反射泰罗人。

抓住这一点,进入原始资料。如果您的集合不公开成员来迭代键(如
字典
公开
),那么这是您唯一的选择。顺便问一下,您的收藏可能是
IEnumerable
?实际上,一个集合不提供任何迭代工具是很奇怪的。它不是叫
youcanollyuseindexcollection

抓取文件并进入源代码。如果您的集合不公开成员来迭代键(如
字典
公开
),那么这是您唯一的选择。顺便问一下,您的收藏可能是
IEnumerable
?实际上,一个集合不提供任何迭代工具是很奇怪的。它不是叫
你可以使用超收集

你不能。如果数据存储在数据库中会怎样?反射将如何帮助您做到这一点?第一步是在调试器中查看legacyInstance的实例,并查看它所具有的属性。如果你能找到一个有你要找的钥匙的,那么你就可以使用反射来访问它。@JohnSaunders:很好。对此我有一种普遍的不好的感觉,但我花了太多时间查看反射文档,而没有足够的时间思考幕后可能发生的事情。你的评论使基本问题相当清楚。你不能。如果数据存储在数据库中会怎样?反射将如何帮助您做到这一点?第一步是在调试器中查看legacyInstance的实例,并查看它所具有的属性。如果你能找到一个有你要找的钥匙的,那么你就可以使用反射来访问它。@JohnSaunders:很好。对此我有一种普遍的不好的感觉,但我花了太多时间查看反射文档,而没有足够的时间思考幕后可能发生的事情。你的评论使基本问题相当清楚。