0
的參數我有這個C#函數:拒絕使用nameof作爲方法
public void MyFunction(string propertyName)
{
....
}
的功能在進一步使用數據庫存儲屬性名稱。
我想阻止此方法的用戶使用nameof(MyProperty)
作爲參數,以防止用戶在更高版本中重命名屬性時可能發生的情況。
是否可以在方法中指定不允許使用nameof
作爲參數調用?
的參數我有這個C#函數:拒絕使用nameof作爲方法
public void MyFunction(string propertyName)
{
....
}
的功能在進一步使用數據庫存儲屬性名稱。
我想阻止此方法的用戶使用nameof(MyProperty)
作爲參數,以防止用戶在更高版本中重命名屬性時可能發生的情況。
是否可以在方法中指定不允許使用nameof
作爲參數調用?
您需要編寫自己的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);
爲什麼你只是不能驗證wheter「propertyName」通過與db值比較是否有效? – pwas
你不能阻止這一點。但是你可以在屬性中定義屬性如'DataPropertyName',並通過反射檢查你的函數中的屬性。 –
是的,你可以防止這種情況,但只能在有限的基礎上。如果你使用Roslyn來檢查所有'MyFunction()'的調用並查看傳入的參數,你可以看到是否有'nameof()'的調用。如果有,你可以拋出一個編譯錯誤。這顯然只有在您可以控制的代碼中才有可能:分析器必須包含在每個調用「MyFunction()」的項目中。 –