基础构造函数调用中的Lambda

纽维尔·克拉克

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

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与内置类型的所有方法类似的方法的委托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?>此派生类的目的是对不可为空的结构采用TryParse方法,并为对应的可为空的结构提供输入验证器控件,这样,当输入无效时,Value属性将设置为null。这样做的方法是在构造函数中接受TryParse委托,然后将TryParse类型的lambda表达式传递给基类构造函数。

如您所见,将TryParse<T>委托转换为委托所需的lambda表达式TryParse<T?>足够长,以至于在调用基本构造函数时非常难看。

我的问题是:在场景中,在这样的基本构造函数调用中具有lambda表达式的情况下,什么被视为标准的“最佳实践”?我无法传递使用Parser属性的实例方法,因为基本构造函数在初始化该属性之前运行。我无法传入采用不可为空的TryParse<T>委托的静态方法,因为这样其签名将与的签名不匹配TryParse<T?>

卢卡斯(Lucas Trzesniewski)

是的,这不是很漂亮...但是您可以使用一个辅助方法,如下所示:

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;
        };
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章