Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取变量(…)的原始名称?_C# - Fatal编程技术网

C# 获取变量(…)的原始名称?

C# 获取变量(…)的原始名称?,c#,C#,我有这个 public static class Parameters { public static void Required<T>(this T parameter, string paramName) where T : class { if (parameter == null) { throw new ArgumentNullException(paramName); }

我有这个

public static class Parameters
{
    public static void Required<T>(this T parameter, string paramName) where T : class
    {
        if (parameter == null)
        {
            throw new ArgumentNullException(paramName);
        }

        // ...
    }
}

是否可以从
Required
方法中删除第二个参数并以某种方式获取原始参数名?不,对吗?

您可以使所需函数接受表达式。从表达式中可以读出成员名称的名称。它被描述了


@Liam不同意,OP没有尝试获取类型的名称。OP希望传入变量的名称。在本例中,我不明白当
参数
null
而不是
paramName
时,为什么要对
paramName
抛出异常。编译表达式以进行像null检查这样便宜的操作似乎是不可能的,很可能是不可能的。对于
参数。Required(obj.Something?(object)obj.somethinelse:obj.EntirelyDifferent)
?可能是不现实的,但你必须记住,这是可能的。@canton7我完全同意。Malcolm博士:“是的,但是你的[计算机]科学家们太专注于他们是否可以,他们没有停下来思考他们是否应该。”我认为缓存编译后的表达式是绝对必须的,这是技术上正确的——最好的一种正确——但不是你想在整个代码库中传播的东西,因为它使空检查变得更加昂贵。为一个参数生成和处理整个表达式树所需的管道是相当大的。我同意。去掉第二个参数的代价很高。
Parameters.Required(settings, nameof(settings));
    public static void Required<T>(Expression<Func<T>> parameter) where T : class
    {
        if (parameter.Compile().Invoke() == null)
        {
            var caller = ((MemberExpression)parameter.Body).Member.Name;
            throw new ArgumentNullException(caller);
        }

        // ...
    }
Parameters.Required(() => settings);