基本构造函数调用中的Lambdas

本文关键字:Lambdas 函数调用 | 更新日期: 2024-10-20 18:23:57

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

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

其中CCD_ 1是表示与内置类型的所有CCD_ 2方法类似的方法的委托。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) { }
}

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

正如您所看到的,将TryParse<T>委托转换为TryParse<T?>委托所需的lambda表达式的长度刚好足以在对基构造函数的调用中非常难看。

我的问题是:在场景中,在对这样的基构造函数的调用中有一个lambda表达式,什么被认为是标准的"最佳实践"我无法传入使用Parser属性的实例方法,因为基构造函数在初始化该属性之前运行。我不能传入一个接受不可为null的TryParse<T>委托的静态方法,因为它的签名与TryParse<T?>的签名不匹配。

基本构造函数调用中的Lambdas

是的,那不好看。。。但是你可以使用一个辅助方法,比如:

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

编写一个作为实现的静态方法,并从lambda:中调用它

public static bool InvokeParser(string text, out T? result, TryParse<T> parser)
{
    T nonNullableResult;
    bool parseSuccessful = parser(text, out nonNullableResult);
    if (!parseSuccessful) result = null;
    else result = nonNullableResult;
    return parseSuccessful;
}

public StructInputValidator(TryParse<T> parser, T initialValue) 
    : base((string text, out T? result) => InvokeParser(text, out result, parser),
    initialValue) { }