gpt4 book ai didi

c# - 基础构造函数调用中的 Lambda

转载 作者:行者123 更新时间:2023-11-30 14:53:35 25 4
gpt4 key购买 nike

好的,所以我有以下基类:

public partial class InputValidator<T> : UserControl {
public InputValidator(TryParse<T> parserMethod, T initialValue) { }
public T Value { get; set; }
public bool IsInputValid { get; }
public override string Text { get; set; }
public string InputInvalidMessage { get; set; }
public TryParse<T> Parser { get; set; }
}

哪里TryParse<T>是代表所有 TryParse 方法的委托(delegate)内置类型的方法。 public delegate bool TryParse<T>(string input, out T result);

上面的类是一个文本输入控件,它尝试使用指定的解析方法来解析用户输入,当它无法解析输入时,它会在文本框下方显示一条消息,表明用户的输入无效。

我现在有以下派生自此类:

public class StructInputValidator<T> : InputValidator<T?> where T : struct
{
public StructInputValidator(TryParse<T> parser, T? initialValue)
: base((string text, out T? result) => {
T nonNullableResult;
bool parseSuccessful = parser(text, out nonNullableResult);
if (!parseSuccessful) result = null;
else result = nonNullableResult;
return parseSuccessful;
},
initialValue) { }
}

上述类采用不可为空的结构作为其类型参数,并派生自 InputValidator<T?>。 .此派生类的目的是为不可为 null 的结构采用 TryParse 方法,并为相应的可为 null 的结构提供输入验证器控件,这样当输入无效时,Value 属性将设置为 null。它这样做的方式是在构造函数中接受一个 TryParse 委托(delegate),然后将类型为 TryParse 的 lambda 表达式传递给基类构造函数。

如您所见,转换 TryParse<T> 所需的 lambda 表达式委托(delegate)给 TryParse<T?> delegate 的长度足以在调用基本构造函数时变得非常丑陋。

我的问题是:在这样的基础构造函数调用中使用 lambda 表达式的场景中,什么被认为是标准的“最佳实践”?我无法传递实例使用 Parser 属性的方法,因为基本构造函数在该属性初始化之前运行。我无法传入采用不可为 null 的 TryParse<T> 的静态方法委托(delegate),因为这样它的签名就不会匹配 TryParse<T?> 的签名.

最佳答案

是的,这并不漂亮......但是你可以使用辅助方法,如下所示:

public class StructInputValidator<T> : InputValidator<T?> where T : struct
{
public StructInputValidator(TryParse<T> parser, T? initialValue)
: base(ToNullableTryParse(parser), initialValue)
{ }

private static TryParse<T?> ToNullableTryParse(TryParse<T> parser)
{
return (string text, out T? result) => {
T nonNullableResult;
bool parseSuccessful = parser(text, out nonNullableResult);
result = parseSuccessful ? (T?)nonNullableResult : null;
return parseSuccessful;
};
}
}

关于c# - 基础构造函数调用中的 Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28907703/

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