如何发现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:很好。对此我有一种普遍的不好的感觉,但我花了太多时间查看反射文档,而没有足够的时间思考幕后可能发生的事情。你的评论使基本问题相当清楚。