gpt4 book ai didi

c# - 按仅在运行时已知的类型进行动态调度

转载 作者:行者123 更新时间:2023-11-30 16:46:09 25 4
gpt4 key购买 nike

我一直在运行我的代码中对相同模式的需求,它经常需要验证一个对象中所有属性的值。伪代码如下所示:

bool ValidateMe(object c) {
var properties = GetProperties(c);
foreach (var property in properties) {
var value = property.GetValue(c);
if (!IsValid(value)) {
return false;
}
}
return true;
}

bool IsValid(int value)
{
return value != int.MaxValue;
}

bool IsValid(double value)
{
return value != double.MaxValue;
}

bool IsValid(object value)
{
return value != null;
} // etc.

我希望代码根据对象的类型(可以通过调用 property.PropertTypevalue.GetType() 找到)动态地将值分派(dispatch)给正确的方法> 假设值不为空)。

我发现使这项工作的唯一方法是这样的:

interface IValidator {
bool IsValid(object value);
}

class PredicateValidator<T> : IValidator {
private Predicate<T> method;
PredicateValidator(Predicate<T> method) {
this.method = method;
}

bool IsValid(object value) {
return IsValid((T) value);
}

bool IsValid(T value) {
return method.invoke(value);
}
}


var validationsByType = new Dictionary<Type,IValidator>();
validationsByType[typeof(double)]=new PredicateValidator<double>(IsValid);
validationsByType[typeof(double)]=new PredicateValidator<int>(IsValid);

然后 Map 允许分派(dispatch)对象以按类型纠正方法:

object value = property.GetValue(c);
bool result = validationsByType[c.GetType()].IsValid(value);

是否有原生 C#(即语言功能)可以在运行时按类型进行这种动态分派(dispatch)?

最佳答案

dynamic 关键字将执行 downcast正确。所以上面的代码改成:

bool ValidateMe(object c) {
var properties = GetProperties(c);
foreach (var property in properties) {
var value = property.GetValue(c);
if (!IsValid((dynamic) value)) {
return false;
}
}
return true;
}

bool IsValid(int value)
{
return value != int.MaxValue;
}

bool IsValid(double value)
{
return value != double.MaxValue;
}

然后 .NET 运行时搜索要调用的最具体 方法签名。我以前认为 dynamic 只适用于 Duck Typing ,但它也适用于对重载方法的动态分派(dispatch)。

关于c# - 按仅在运行时已知的类型进行动态调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40930422/

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