gpt4 book ai didi

c# - 从将动态参数作为输入的 lambda 中获取属性名称

转载 作者:太空宇宙 更新时间:2023-11-03 23:13:25 25 4
gpt4 key购买 nike

我正在设计一个测试 API。我想要一个像这样的 API:

// There is a dynamic object which should be tested to have certain properties.
dynamic result = SomeMethod();

AssertPropertyIsNotNull(resut, o => o.Title);
AssertPropertyIsNotNull(resut, o => o.City.Name);

我想编写 TestProperty 方法来断言该属性并显示一个正确的消息它失败时如下:

private void AssertPropertyIsNotNull(dynamic result, Func<dynamic, object> propertySelector)
{
var propertyPath = GetPropertyPathFromFunc(propertySelector);
var errorMessage = $"{propertyPath} is not filled properly."
Assert.IsNotNull(propertySelector(result), errorMessage);
}

在此示例中,我需要 GetPropertyPathFromFunc 的正文。

问题 我如何编写一个方法来获取像 o => City.Name 这样的 lambda 作为输入并返回像 "City.Name"这样的字符串 作为结果。

最佳答案

当您使用 dynamic 时,您失去了类型安全和编译时成员名称检查检查,因此使用字符串作为属性名称没有任何区别。

这是一个解决方案。它需要大量的错误检查和异常处理。您还可以添加缓存机制以减少反射开销。

public static bool IsPropertyNull(dynamic obj, string propertyName)
{
var path = propertyName.Split('.');
object tempObject = obj;
for (int i = 0; i < path.Length; i++)
{
PropertyInfo[] dynamicProperties = tempObject.GetType().GetProperties();
var property = dynamicProperties.Single(x => x.Name == path[i]);
tempObject = property.GetValue(tempObject);
}
return tempObject == null;
}

bool isTitleNull = IsPropertyNull(result, "Title");
bool isCityNameNull = IsPropertyNull(result, "City.Name");

关于c# - 从将动态参数作为输入的 lambda 中获取属性名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38123405/

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