获取值来自的属性名称

时间:2008-11-15 18:01:56

标签: c# .net reflection

我想知道如何获取方法参数值来自的属性的名称。下面的代码片段显示了我想要做的事情:

Person peep = new Person();
Dictionary<object, string> mapping = new Dictionary<object, string>();
mapping[peep.FirstName] = "Name";
Dictionary<string, string> propertyToStringMapping = Convert(mapping);
if (mapping[peep.FirstName] == propertyToStringMapping["FirstName"])
  Console.WriteLine("This is my desired result");

private Dictionary<string, string> Convert(Dictionary<object, string> mapping)
{
   Dictionary<string, string> stringMapping = new Dictionary<string, string>();
   foreach (KeyValuePair<object, string> kvp in mapping)
   {
     //propertyName should eqal "FirstName"
     string propertyName = kvp.Key??????
     stringMapping[propertyName] = kvp.Value;
   }
   return stringMapping;
}

3 个答案:

答案 0 :(得分:1)

您无法以这种方式执行此操作,因为它的工作方式是C#通过调用其get访问器来计算FirstName属性的值,并将其值传递给字典的索引器。因此,您发现FirstName值的方式完全丢失。就像你评估2 + 2的方式一样。 如果你写“x = 2 + 2”,x将具有值4但是没有办法判断它是3 + 1还是2 + 2或5 +( - 1)还是......评估为4。

答案 1 :(得分:0)

我认为最终您需要存储与该属性关联的PropertyInfo对象,或者您在映射对象中存储属性名称的字符串表示形式。您拥有的语法:

mapping[peep.FirstName] = "Name";

将在字典中创建一个条目,其键值等于peep.FirstName属性的值,并且Value等于“Name”。

如果将属性名称存储为如下字符串:

mapping["FirstName"] = "Name";

然后,您可以使用反射来获取对象的“FirstName”属性。但是,您必须将“peep”对象传递给Convert函数。这似乎与你想做的事情有些相反。

您也可能会对表达式感到疯狂,并执行以下操作:

var mapping = new Dictionary<Expression<Action<T>>,string>();
mapping[ p => p.FirstName ] = "Name";

然后在你的转换函数中你可以检查表达式。它看起来像是:

private Dictionary<string,string> Convert(Dictionary<Expression<Action<T>>,string> mapping)
{
    var result = new Dictionary<string,string>();
    foreach(var item in mapping)
    {
        LambdaExpression ex = item.Key as LambdaExpression;
        string propertyName = ((MemberExpression)ex.Body).Member.Name;
        string propertyValue = item.Value;
        result.Add(propertyName,proeprtyValue);
    }
    return result;
}

这或多或少偏离了我的脑海,所以我可能会稍微改变一下表达式。如果这个实现存在问题,请告诉我,我会看看是否可以找到一个功能性的例子。

答案 2 :(得分:0)

我对C#了解不多,但我认为 peep 是一个枚举?至于Java,你可以这样做:

String propertyName = kvp.key.toString()

也许在C#中有类似的东西?

即使窥视不是枚举:我认为没有理由为什么密钥应该是一个任意对象?那么解决方案是使用枚举作为键的类型呢?

另外,我不知道你要做什么,但通常,我不建议你将枚举键转换为字符串。你能做什么用字符串做什么你也不能用枚举?