【问题标题】:Getting the property name that a value came from获取值来自的属性名称
【发布时间】:2008-11-15 18:01:56
【问题描述】:

我想知道如何获取方法参数值来自的属性的名称。下面的代码 sn-p 显示了我想要做什么:

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;
}

【问题讨论】:

    标签: c# .net reflection


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      mapping[peep.FirstName] = "Name";
      

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

      如果您将属性名称存储为字符串,例如:

      mapping["FirstName"] = "Name";
      

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

      您还可以对 Expressions 发疯,并执行以下操作:

      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;
      }
      

      这或多或少在我脑海中浮现,所以我可能对表达式类型有所了解。如果此实现存在问题,请告诉我,我会看看是否可以制定一个功能示例。

      【讨论】:

        【解决方案3】:

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

        String propertyName = kvp.key.toString()
        

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

        即使 peep 不是枚举:我看不出为什么键应该是任意对象?那么也许解决方案就是使用枚举作为键的类型?

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-31
          • 1970-01-01
          • 2011-10-02
          • 2012-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多