【发布时间】:2020-03-17 20:28:07
【问题描述】:
我正在尝试基于 xml 数据动态创建一个模拟。这适用于大多数类型,但枚举结果有点棘手。这 ???在我的代码中需要枚举的类型。但显然在编译时类型是未知的,所以我不得不求助于反射。我可能不得不使用 MakeGenericMethod 直接或间接调用 Expression.Lambda,但这似乎只是解决了问题,因为 mock.Setup 也需要编译时类型。这就是我卡住的地方。任何帮助表示赞赏。
public static Mock<T> DeserializeMock<T>(XElement node)
where T : class
{
var mock = new Mock<T>();
foreach (var property in PropertyInfoHelper.EnumeratePublicAndInternalProperties(typeof(T)))
{
var attribute = node.Attribute(property.Name);
if (property.PropertyType == typeof(string))
{
var parameter = Expression.Parameter(typeof(T));
var body = Expression.PropertyOrField(parameter, property.Name);
var propertyExpression = Expression.Lambda<Func<T, string>>(body, parameter);
mock.Setup(propertyExpression).Returns(attribute.Value);
}
// ... other types omitted for brevity...
else if (property.PropertyType.IsEnum)
{
var parameter = Expression.Parameter(typeof(T));
var body = Expression.PropertyOrField(parameter, property.Name);
var propertyExpression = Expression.Lambda<Func<T, ???>>(body, parameter);
mock.Setup(propertyExpression).Returns(convertToEnum(attribute.Value, property.PropertyType));
}
}
return mock;
}
【问题讨论】:
-
你不能做一个property.GetType()然后使用激活器创建枚举然后赋值吗?
-
创建枚举值不是问题。我在 convertToEnum 方法中这样做。问题是创建 propertyExpression。使用 Activator 你不会得到编译时类型。并且 moq 方法需要编译时类型。