我的目标是找到所有“字符串”类型属性,并将它们分配给特定的字符串值,例如“This is a testing string”。
我现在可以在类中找到所有字符串类型属性,但在将字符串值赋给类中的属性时总是会遇到问题,这是另一个类的类属性。
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类的“month”属性时,它总是抛出异常。
如何将正确的值分配到正确的实例中?
答案 0 :(得分:1)
如果您想分配month
和year
值,则需要通过执行Type.GetType(CredCard.Expiration).Properties
来获取其PropInfo,因为它们不属于credcard
但属于credcard.Expiration
的属性credcard.Expiration
的属性。
您必须检查属性并将其分配给credcard
而不是// prop.Name == "month" || prop.Name == "year"
prop.SetValue(credcard.Expiration, "somestring");
。
if(prop.Name.Equals("Expiration"))
{
var expiration = new Expiration
{
month = "someString",
year = "someString"
};
prop.SetValue(credcard,expiration);
}
另一种方法是将新的Expiration对象分配给Expiration属性:
{{1}}
答案 1 :(得分:0)
查看代码,您将获取Credit_Card
上的所有字符串属性,然后以递归方式获取子对象上的所有字符串属性。
您的问题来自于它从string month
返回Expiration
这一事实。然后,您尝试在Expiration.month
实例Credit_Card
上设置credcard
属性。
这不起作用。目标必须与声明Type
的{{1}}匹配。这就是你得到的原因:
System.Reflection.TargetException未处理,而messagei是 “对象与目标类型不匹配”
您需要拆分循环,以便在正确的层次结构链中进行循环,并拥有将使用您的数据更新的正确实例(目标)。