【问题标题】:Using Reflection to update existing Instance [duplicate]使用反射更新现有实例 [重复]
【发布时间】:2016-01-22 05:40:56
【问题描述】:

我有一个字典,其中包含我想要在我拥有的类的实例中匹配和更新的值对。

例如我有;

name -> test
userid -> 1

在我的班级里,我有

MyClass.Name
MyClass.UserId

我想设置MyClass.Name = test

目前我有以下方法;

 public static GridFilters ParseGridFilters(Dictionary<string,string> data, MyClass myClass)
        {
            foreach (KeyValuePair<string, string> kvp in data)
            {
                Type t = typeof(MyClass);
                t.GetProperty(kvp.Value, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);

            }

            return myClass;
        }

然后我如何检查 kvp.Key 是否存在(不管我认为我已经用 BindingFlags 覆盖的情况),然后将 kvp.Value 设置为 myClass.(kvp.Key)

【问题讨论】:

  • kvp.Key is in 是什么意思?什么时候进去?什么时候出?
  • TL;博士。您是否正在寻找“带有反射的 C# 设置属性” - stackoverflow.com/questions/619767/…
  • 我可以假设您想将字典中的值分配给对象的属性,将属性名称与字典键匹配。但是您的字典仅包含字符串值。 MyClass 长什么样?它有哪些类型的属性?
  • @AlexeiLevenkov 是的完美没有找到这个:)

标签: c# reflection


【解决方案1】:

您必须保存对通过反射检索的属性的引用,然后使用 SetValue 设置其值。

您的代码也有错误。 从您的解释看来,该属性的名称似乎在 Key 中,而不是 Value

 public static GridFilters ParseGridFilters(Dictionary<string,string> data, MyClass myClass)
    {
        foreach (KeyValuePair<string, string> kvp in data)
        {
            Type t = typeof(MyClass);
            var prop = t.GetProperty(kvp.Key, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
            prop.SetValue(myClass, kvp.Value, null);
        }

        return myClass;
    }

【讨论】:

  • 谢谢,抱歉,我在查看代码时意识到我的 .Value 错误。
猜你喜欢
  • 1970-01-01
  • 2012-04-06
  • 2014-06-14
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
相关资源
最近更新 更多