![](/img/trans.png)
[英]what is the equivalent of as Object,.Factory, byVal in vb.net to c#?
[英]VB.NET and calling byval/byref C# overloads
我們有一個C#類,其中包括兩個函數,它們的參數僅在參數修飾符上有所不同:
bool DoSomething(Object obj){};
bool DoSomething(ref Object obj){};
現在我們需要從VB.NET調用此方法(實際上是其中任何一個)。 問題在於VB.NET編譯器無法決定使用哪種方法。
問題是:有沒有辦法告訴編譯器我們想要第一個變體(或者第二個變體,對調用者來說沒有關系)?
在VB.NET中將呼叫編寫為DoSomething((myObj))
(即添加括號)無濟於事。
您可以創建一個單獨的用C#編寫的庫,該庫為助手方法提供不同的名稱,以使您能夠調用模棱兩可定義的DoSomething
方法。 您不必這樣做,並且人們可能會想知道您為什么這樣做,因此您可以在其中添加嚴厲的評論,解釋為什么這樣做是必要的。
或者您可以使用反射,大致像這樣:
Dim methods = GetType(WhatEverTheType).GetMethods()
Dim doSomethingMethod = methods.Single(Function(method As MethodInfo)
Return method.Name = "DoSomething" _
And Not method.GetParameters()(0).ParameterType.IsByRef
End Function)
doSomethingMethod.Invoke(instanceOfWhatEverTheType)
AFAIK,唯一的方法是使用Reflection強制對API的調用。 盡管我不確定是否可以。
問題在於,創建2個僅因ref
而不同的重載不符合CLS,因此不能保證在所有.NET語言中都能正常工作。 為避免發生這種情況,應將CLSCompliantAttribute添加到AssemblyInfo.cs
文件中,然后當CLS兼容性中斷時,編譯器將向您發出警告。
[assembly: System.CLSCompliant(true)]
解決此問題的一種方法是添加可以通過VB.NET調用的包裝器函數。
bool DoSomething(Object obj){};
bool DoSomething(ref Object obj){};
// Call this method from VB.NET
bool DoSomething2(ref Object obj)
{
return DoSomething(ref obj);
}
您可以通過幾種不同的方法來使此清潔器更清潔,例如,如Scott Hannen所述,制作一個單獨的程序集以對其進行包裝,或者只是將符合CLS的wrapper方法用作擴展方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.