2016-06-23 49 views
0

的參數我有這個C#函數:拒絕使用nameof作爲方法

public void MyFunction(string propertyName) 
{ 
    .... 
} 

的功能在進一步使用數據庫存儲屬性名稱。

我想阻止此方法的用戶使用nameof(MyProperty)作爲參數,以防止用戶在更高版本中重命名屬性時可能發生的情況。

是否可以在方法中指定不允許使用nameof作爲參數調用?

+0

爲什麼你只是不能驗證wheter「propertyName」通過與db值比較是否有效? – pwas

+0

你不能阻止這一點。但是你可以在屬性中定義屬性如'DataPropertyName',並通過反射檢查你的函數中的屬性。 –

+3

是的,你可以防止這種情況,但只能在有限的基礎上。如果你使用Roslyn來檢查所有'MyFunction()'的調用並查看傳入的參數,你可以看到是否有'nameof()'的調用。如果有,你可以拋出一個編譯錯誤。這顯然只有在您可以控制的代碼中才有可能:分析器必須包含在每個調用「MyFunction()」的項目中。 –

回答

3

您需要編寫自己的DiagnosticAnalyzer,訂閱SyntaxKind.InvocationExpression,context.RegisterSyntaxNodeAction。然後檢查被調用的方法是否爲有問題的方法,然後查看是否有任何參數是nameof調用。因此,示意圖如下:

context.RegisterSyntaxNodeAction(
    c => 
    { 
     var invocation = (InvocationExpressionSyntax)c.Node; 
     var symbol = c.SemanticModel.GetSymbolInfo(invocation.Expression).Symbol as IMethodSymbol; 
     if (!IsMyMethod(symbol)) 
     { 
      return; 
     } 
     if (invocation.ArgumentList != null && 
      invocation.ArgumentList.Arguments 
       .Select(a => a.Expression) 
       .OfType<InvocationExpressionSyntax>() 
       .Any(i => i.Expression.ToString() == "nameof")) 
     { 
      c.ReportDiagnostic(...); 
     } 
    }, 
    SyntaxKind.InvocationExpression);