【问题标题】:In Reflection, how to set a correct value for a property?在反射中,如何为属性设置正确的值?
【发布时间】:2015-04-13 23:04:08
【问题描述】:

我的目标是找到所有“字符串”类型的属性,并将它们分配给特定的字符串值,例如“这是一个测试字符串”。

我现在可以在一个类中找到所有字符串类型的属性,但是在为一个类中的属性赋值时总是出现问题,这是另一个类的类属性。

 public class Credit_Card
{
    public string brand { get; set; }
    public int billing_phone { get; set; }
    public string credit_card_verification_number { get; set; }
    public Expiration expiration { get; set; }
}

public class Expiration
{
    public string month { get; set; }
    public string year { get; set; }
}

 class Program
{
    static void Main(string[] args)
    {
        Credit_Card credcard = new Credit_Card { brand = "Visa", billing_phone = 12345, credit_card_verification_number = "1234", expiration = new Expiration { month = "11", year = "2016" } };
        foreach (PropertyInfo prop in GetStringProperties(credcard.GetType()))
        {
            prop.SetValue(credcard,"testing string!!",null);
            Console.WriteLine(prop.GetValue(credcard,null));
        }
        Console.ReadLine();
    }

    public static IEnumerable<PropertyInfo> GetStringProperties(Type type)
    {
        return GetStringProperties(type, new HashSet<Type>());
    }

    public static IEnumerable<PropertyInfo> GetStringProperties(Type type, HashSet<Type> alreadySeen)
    {
        foreach (var prop in type.GetProperties())
        {
            var propType = prop.PropertyType;
            if (propType == typeof(string))
                yield return prop;
            else if (alreadySeen.Add(propType))
                foreach (var indirectProp in GetStringProperties(propType, alreadySeen))
                    yield return indirectProp;
        }
    }
}

当循环运行到 Expiration 类的“月”属性时,它总是抛出异常。

如何将正确的值分配给正确的实例?

【问题讨论】:

  • 你遇到了什么异常?
  • System.Reflection.TargetException 未处理,消息为“对象与目标类型不匹配”。它发生在 prop.SetValue(credcard,"testing string!!",null)

标签: c# reflection properties


【解决方案1】:

如果您想分配 monthyear 值,则需要通过 Type.GetType(CredCard.Expiration).Properties 获取它们的 PropInfo,因为它们不是 credcard 的属性,而是 credcard.Expiration 的属性。

您必须检查属性并将它们分配给credcard.Expiration 而不是credcard

// prop.Name == "month" || prop.Name == "year"
prop.SetValue(credcard.Expiration, "somestring");

另一种选择是将新的 Expiration 对象分配给 Expiration 属性:

if(prop.Name.Equals("Expiration"))
{
  var expiration = new Expiration
  {
   month = "someString",
   year = "someString"
  };
  prop.SetValue(credcard,expiration);
}

【讨论】:

  • 您好,我希望此方法尽可能通用,并且不想包含硬编码格式的任何属性。我的目标是这个方法可以应用任何类,具有任何类类型属性。谢谢。
【解决方案2】:

查看代码,您正在获取Credit_Card 上的所有字符串属性,然后递归地获取子对象上的所有字符串属性。

您的问题来自于它从Expiration 返回string month。然后,您尝试在您的Credit_Card 实例credcard 上设置Expiration.month 属性。

那行不通。目标必须与声明PropertyInfoType 匹配。这就是你得到的原因:

System.Reflection.TargetException 未处理,消息是 “对象与目标类型不匹配”

您需要拆分循环,以便在正确的层次结构链中执行它们并拥有将使用您的数据更新的正确实例(目标)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多