簡體   English   中英

從該方法中獲取變量調用方法的名稱

[英]Get name of variable calling method from within that method

我想為對象創建一個擴展方法,檢查對象是否為null並拋出異常(如果是)。 我想保留原始變量名稱。 我可以以某種方式從擴展方法中獲取它嗎? 必須編寫customer.NotNull("customer") vs customer.NotNull()是“麻煩的”。

不,不幸的是你不能。 變量名在運行時不可用。 但是,您可以使用以下表達式:

void NotNull<T>(Expression<Func<T>> expression)
{
    var me = expression.Body as MemberExpression;
    var name = me.Member.Name;
    var value = expression.Compile().Invoke();
    ...
}


NotNull(() => customer);
// using System.Diagnostics.Contracts;
using System.Linq.Expressions;

static void ThrowIfNull<T>(Expression<Func<T>> expr) where T : class
{
    // Contract.Requires(expr != null);
    // Contract.Requires(expr.Body.NodeType == ExpressionType.MemberAccess);
    if (((object)expr.Compile().Invoke()) == null)
    {
        throw new ArgumentNullException(((MemberExpression)expr.Body).Member.Name);
    }
}

然后像這樣稱呼它:

object someVariable = null;
ThrowIfNull(() => someVariable);  // will throw an ArgumentNullException 
                                  // with paramName == "someVariable"

PS:我不確定這是否是一個好主意:首先構建一個表達式樹,然后每次調用此方法時都會編譯它,這樣就可以檢查變量是否包含null引用,如果是,則檢索變量名稱。 void ThrowIfNull<T>(T arg, string paramName)的東西不是很好,但可能會表現得更好!

正如另一個所說,但請注意,編譯表達式是很慢的......所以這個變量接收值作為參數。 你必須寫更多,但對於被稱為百次的方法,它可能會更好。

[DebuggerHidden]
public static void NotNull<T>(T value, Expression<Func<T>> exp) where T : class
{
    if (value != null)
    {
        return;
    }

    var body = exp.Body as MemberExpression;

    if (body == null)
    {
        throw new ArgumentException("Wrongly formatted expression");
    }

    throw new ArgumentNullException(body.Member.Name);
}

用法:

NotNull(str, () => str);

[DebuggerHidden]是調試器不會進入該方法的。 最后,如果方法拋出,通常是因為你傳遞的內容,而不是方法中的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM