gpt4 book ai didi

c# - 获取扩展方法的被调用者名称

转载 作者:太空狗 更新时间:2023-10-30 01:32:58 25 4
gpt4 key购买 nike

我构建了一个简单的 ArgumentValidator 类,以简化任何给定方法中的参数前提条件。它们中的大多数都是 null 或边界检查,并且在几次之后变得非常乏味

if (arg == null ) throw new ArgumentNullException(nameof(arg));

所以我想出了以下设置:

public static class ArgumentValidator
{
public interface IArgument<T>
{
string ParamName { get; }
T Value { get; }
}

private class Argument<T>: IArgument<T>
{
public Argument(T argument, string paramName)
{
ParamName = paramName;
Value = argument;
}

public string ParamName { get; }
public T Value { get; }
}

public static IArgument<T> Validate<T>(this T argument, string paramName = null)
{
return new Argument<T>(argument, paramName ?? string.Empty);
}

public static IArgument<T> IsNotNull<T>(this IArgument<T> o)
{
if (ReferenceEquals(o.Value, null))
throw new ArgumentNullException(o.ParamName);

return o;
}

public static IArgument<T> IsSmallerThan<T, Q>(this IArgument<T> o, Q upperBound) where T : IComparable<Q> { ... }

//etc.
}

我可以通过以下方式使用它:

public Bar Foo(object flob)
{
flob.Validate(nameof(flob)).IsNotNull().IsSmallerThan(flob.MaxValue);
}

理想情况下,我希望在 Validate 调用中去掉 nameof(flob),并最终完全去掉 ValidateValidate 的唯一目的是避免在每次链下检查时都必须通过 nameof(...)

有没有办法在 Validate() 方法中获取名称 flob

最佳答案

用扩展方法做到这一点并不容易。使用采用 LINQ 表达式(派生自 devdigital's answer here )的静态方法更容易:

public static T Validate<T>(this Expression<Func<T>> argument)
{
var lambda = (LambdaExpression)argument;

MemberExpression memberExpression;
if (lambda.Body is UnaryExpression)
{
var unaryExpression = (UnaryExpression)lambda.Body;
memberExpression = (MemberExpression)unaryExpression.Operand;
}
else
{
memberExpression = (MemberExpression)lambda.Body;
}

string name = memberExpression.Member.Name;

Delegate d = lambda.Compile();

return (T)d.DynamicInvoke();
}

里面的name是你放在方法中的属性的名字:

MyMethods.Validate(() => o);

由于 Validate 返回 T,您可以进一步使用它。这可能不会像您希望的那样执行,但这是唯一可行的选择。

也可以将其作为扩展方法,您必须自己手动创建表达式:

Expression<Func<object>> f = () => o; // replace 'object' with your own type

f.Validate();

关于c# - 获取扩展方法的被调用者名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35288353/

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