c# - 获取属性名称而不通过反射传递它?

标签 c# reflection

我正在尝试做这样的事情:

    public static class Validate
    {
        public static void AgainstNull(string str)
        {
            if (String.IsNullOrWhiteSpace(str))
            {
                // how do I know the property name in the calling code?
                throw new ArgumentNullException("property name from caller");
            }
        }
    }

这样我就可以在我的代码库中使用与此类似的模式:

    public void Foo(string bar)
    {
        Validate.AgainstNull(bar);

        // other processing here
    }

我如何知道从我的验证方法中的调用代码传入的属性的名称?

最佳答案

正如 Chris Sinclair 提到的,您可以使用 LINQ 表达式,这是此类代码的示例:

public static class Validate
{
    public static void AgainstNull(System.Linq.Expressions.Expression<Func<string>> expr)
    {
        var str = expr.Compile().Invoke();
        if (str == null)
        {
            string name = (expr.Body as System.Linq.Expressions.MemberExpression).Member.Name;
            throw new ArgumentNullException(name);
        }
    }
}

关于c# - 获取属性名称而不通过反射传递它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19941254/

相关文章:

c# - 如何在运行时创建可变维度数组?

java - 方法注释和默认访问级别的奇怪行为

sql-server - 我可以从 .NET 获取 SqlCommand 对象(带有 SQL 参数)生成的完整 SQL 字符串吗?

c# - 更新和持久化数据集问题

c# - 为什么Reflector无法显示字节数组?这是由于某些技术限制吗?

c# - 有人可以用简单的英语解释 ConfigurationSection 和 ConfigurationElement 之间的区别吗?

c# - C#执行定时任务

c# - 检查类/接口(interface)继承的正确方法是什么?

c# - 仅在 C# 中更改 Xamarin Forms 标签的颜色,无 XAML

c# - 如何使用 Mono.Security 设置 X509 SubjectAltName (SAN)?