首页 / C# / c# – 获取被调用者的扩展方法名称
c# – 获取被调用者的扩展方法名称
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 获取被调用者的扩展方法名称,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2054字,纯文字阅读大概需要3分钟。
内容图文
![c# – 获取被调用者的扩展方法名称](/upload/InfoBanner/zyjiaocheng/788/e623155315f94c04b07b70d21200b942.jpg)
我已经构建了一个简单的ArgumentValidator类,以简化任何给定方法中的参数前置条件.它们中的大多数是空值或边界检查,经过几次后它变得相当繁琐
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)并最终完全消除Validate;验证的唯一目的是避免在每次检查链上传递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();
}
里面的名字是你在方法中放置的属性的名称:
MyMethods.Validate(() => o);
由于Validate返回T,您可以进一步使用它.这可能没有您想要的那样,但这是唯一可行的选择.
也可以将其作为扩展方法,您必须手动创建表达式:
Expression<Func<object>> f = () => o; // replace 'object' with your own type
f.Validate();
内容总结
以上是互联网集市为您收集整理的c# – 获取被调用者的扩展方法名称全部内容,希望文章能够帮你解决c# – 获取被调用者的扩展方法名称所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。