gpt4 book ai didi

c# - 如何期望类的属性类型作为泛型函数中的参数?

转载 作者:行者123 更新时间:2023-12-02 13:50:13 25 4
gpt4 key购买 nike

为了简单起见,请看以下示例,该示例在 C# 中无效:

public void SomeGenericFunc<T>(T classObject, T.Property.Type classPorpertyType)
{
string propertyName = nameof(classPropertyType);
// ...
}

简单类示例:

public class Car
{
public Car(){}

public int DoorsCount { get; set; }

public string Color { get; set; }
}

函数调用看起来像这样:

SomeGenericFunc<Car>(new Car(), Car.DoorsCount); //should be valid
SomeGenericFunc<Car>(new Car(), SomeType); //should be invalid at compile time: SomeType is not a property of Car
SomeGenericFunc<Car>(new Car(), Car.Color); //should be valid

显然没有像 T.Property.Type 这样的东西。在 C# 中可用。在此示例中,我不想传递 nameof(Car.DoorsCount)每次我调用该函数时。我想要nameof()调用 SomeGenericFunc<T>() ,这样我就可以打电话SomeGenericFunc<T>()与任何类和该类的任何属性。

那么是否可以在泛型函数中传递并期望类的属性类型?

编辑:

明确地说:我不想要属性的值 Car.DoorsCount 。我想要属性的名称,而不直接将其作为参数传递。我想解析 SomeGenericFunc<T>() 中的属性名称.

最佳答案

尝试使用表达式树:

static void GetPropertyName<T, TProperty>(Expression<Func<T, TProperty>> property) {
var propertyInfo = (property.Body as MemberExpression).Member;
Console.WriteLine(propertyInfo.Name);
}

你可以这样调用它:

GetPropertyName((Car c) => c.DoorsCount);

显然,如果您尝试传递不是成员表达式的内容,这将引发异常。

这里不能使用nameof,因为nameof是一个常量表达式。括号中的表达式不被求值。整个 nameof 表达式在编译时计算。这意味着尝试获取作为参数传递的属性的名称只会获取参数的名称。您需要一些在运行时起作用的东西,例如表达式树。

另请注意,此处不需要 Car 实例。该方法需要的只是一个表达式。没有任何属性(property)的值(value)被实际评估。

关于c# - 如何期望类的属性类型作为泛型函数中的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50811750/

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