gpt4 book ai didi

c# - 为什么 GetProperties() 在使用 typeof() 时不返回属性,但在使用 GetType() 时返回属性?

转载 作者:行者123 更新时间:2023-12-05 09:31:21 27 4
gpt4 key购买 nike

我有一个 C# 代码可以查看类中的每个公共(public)属性并创建键和值的集合。 key 只是一个点符号变量,用于访问该属性;

我有以下型号

public class Home
{
public string Id { get; set; }
public string Summary { get; set; }
public Address Address { get; set; }
}

public class Address
{
public Street Street { get; set; }
public string CityName { get; set; }
public string StateName { get; set; }
}

public class Street
{
public string Number { get; set; }
public string Name { get; set; }
}

然后我有下面的函数

public void GetPropertyKeyValue<T>(T obj, string prefix, List<ExtractedTerm> pairs)
{
if (pairs == null)
{
throw new ArgumentNullException(nameof(pairs));
}

// This works of the first object, but fails on the class properties
var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

foreach (var property in properties)
{
string key = property.Name;

if (!string.IsNullOrWhiteSpace(prefix))
{
key = $"{prefix}.{property.Name}";
}

Type type = property.PropertyType;
object value = property.GetValue(obj, null);

if (type.IsClass && !type.IsInterface && !type.IsEnum && !type.IsPrimitive && !type.IsString())
{
GetPropertyKeyValue(value, key, ref pairs);

continue;
}

pairs.Add(new ExtractedTerm(key, value, property.PropertyType));
}
}

上面的方法是这样调用的

var home = new Home() {
Id = "100",
Summary = "Test",
Address = new Address() {
CityName = "Los Angeles"
}
}

var pairs = new List<ExtractedTerm>();
GetPropertyKeyValue(home, null, pairs);

上面的代码在 Home.IdHome.SummaryHome.Address 上完美运行,但是 Address 是类类型的属性,因此递归调用 GetPropertyKeyValue 方法。当传递 Address 时,代码 typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance) 不返回任何属性。但是,代码 obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance) 返回预期的属性。但我真的不能指望 obj.GetType() 因为 obj 可能为空。正如您在上面的示例中注意到的那样,Street 属性为空,obj.GetType() 将引发异常。

为什么 typeof() 在某些情况下有效但并非总是如此?即使 obj 为 null,如何始终获取属性?

最佳答案

类型推断发生在编译时。

换句话说,由于value是静态类型object

object value = property.GetValue(obj, null);

下面一行:

GetPropertyKeyValue(value, key, ref pairs);

编译为

GetPropertyKeyValue<object>(value, key, ref pairs);

typeof(object) 产生……好吧……object 类型。


如何解决?不是使方法通用,而是传入类型为 Type 的参数。这样,您只需在递归调用中传递 property.PropertyType。我建议使用以下签名:

public void GetPropertyKeyValue<T>(T obj, string prefix, List<ExtractedTerm> pairs)
{
return GetPropertyKeyValue(typeof(T), obj, prefix, pairs);
}

private void GetPropertyKeyValue(Type type, object obj, string prefix, List<ExtractedTerm> pairs)
{
// contains your logic and recursively calls the non-generic version
...
}

关于c# - 为什么 GetProperties() 在使用 typeof() 时不返回属性,但在使用 GetType() 时返回属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68823463/

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