gpt4 book ai didi

C# 递归反射

转载 作者:太空狗 更新时间:2023-10-29 22:12:19 25 4
gpt4 key购买 nike

我正在研究 Reflection ,但在进行递归时卡住了。

代码:

public class User {
public string Name;
public int Number;
public Address Address;
}


public class Address {
public string Street;
public string State;
public string Country;
}

现在我正在打印值。

 Type t = user.GetType();  
PropertyInfo[] props = t.GetProperties();
foreach (PropertyInfo prp in props)
{
if(!prp.GetType().IsPrimitive && prp.GetType().IsClass)
{
// Get the values of the Inner Class.
// i am stucked over here , can anyone help me with this.

Type ty = prp.GetType();
var prpI = ty.GetProperties();
//var tp = ty.GetType().;
foreach (var propertyInfo in prpI)
{
var value = propertyInfo.GetValue(prp);
var stringValue = (value != null) ? value.ToString() : "";
console.WriteLine(prp.GetType().Name + "." + propertyInfo.Name+" Value : " +stringValue);
}
}
else
{
var value = prp.GetValue(user);
var stringValue = (value != null) ? value.ToString() : "";
console.writeline(user.GetType().Name + "." + prp.Name+" Value : " +stringValue);
}
}

我想知道如何确定该属性是类还是基元。如果它是一个类,则进行递归。

最佳答案

首先,如果你想访问一个类型的属性,确保你使用的是一个有属性的类型:

public class User {
public string Name{get;set;}
public int Number{get;set;}
public Address Address{get;set;}
}


public class Address {
public string Street{get;set;}
public string State{get;set;}
public string Country{get;set;}
}

其次,prp.GetType() 将始终返回 PropertyInfo。您正在寻找 prp.PropertyType,它将返回属性的类型。

此外,if(!prp.GetType().IsPrimitive && prp.GetType().IsClass) 不会按您想要的方式工作,因为 String 例如是一个类,也不是原始类。最好使用 prp.PropertyType.Module.ScopeName != "CommonLanguageRuntimeLibrary"

最后但同样重要的是,要使用递归,您实际上必须将代码放入方法中。

这是一个完整的例子:

IEnumerable<string> GetPropertInfos(object o, string parent=null)
{
Type t = o.GetType();
PropertyInfo[] props = t.GetProperties(BindingFlags.Public|BindingFlags.Instance);
foreach (PropertyInfo prp in props)
{
if(prp.PropertyType.Module.ScopeName != "CommonLanguageRuntimeLibrary")
{
// fix me: you have to pass parent + "." + t.Name instead of t.Name if parent != null
foreach(var info in GetPropertInfos(prp.GetValue(o), t.Name))
yield return info;
}
else
{
var value = prp.GetValue(o);
var stringValue = (value != null) ? value.ToString() : "";
var info = t.Name + "." + prp.Name + ": " + stringValue;
if (String.IsNullOrWhiteSpace(parent))
yield return info;
else
yield return parent + "." + info;
}
}
}

这样使用:

var user = new User { Name = "Foo", Number = 19, Address = new Address{ Street="MyStreet", State="MyState",  Country="SomeCountry" }    };
foreach(var info in GetPropertInfos(user))
Console.WriteLine(info);

会输出

User.Name: Foo
User.Number: 19
User.Address.Street: MyStreet
User.Address.State: MyState
User.Address.Country: SomeCountry

关于C# 递归反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14683581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com