我有一個遺留解決方案,其中包含一些 C# 專案(最新的)和一些 VB 專案(最舊的)。我知道這不是一個好習慣,但這是我現在所擁有的,所以我必須處理它。
在 C# 專案中,我有一些這樣的代碼:
public class MyObjectClass
{
... more code here ...
public delegate void SelectedItemChange(IMyInterface oldItem, IMyInterface newItem);
public virtual SelectedItemChange SelectedItemChanged { get; set; }
}
當我以這種方式從另一個 C# 專案中使用它時,這就像一個魅力:
public class MySecondaryClass
{
... more code here ...
MyObjectClass MyObject = new();
MyObject.SelectedItemChanged = (sender, args) => { DoSomething(); };
}
到現在為止還挺好。問題是當我必須使用來自 VB.NET 專案的相同委托時。我試過這個:
Public Class MySecondaryClassVB
... more code here ...
Dim MyObject as MyObjectClass = New MyObjectClass()
AddHandler MyObject.SelectedItemChanged, Sub(sender As Object, args As EventArgs)
DoSomething()
End Sub
End Class
但SelectedItemChanged出現在 Visual Studio 中以紅色下劃線顯示,并出現下一個錯誤:
“SelectedItemChanged”不是“MyObjectClass”的事件
我無法理解為什么它在 C# 中而不是在 VB.NET 中作業,所以我猜我的AddHandler語法不正確。什么是正確的語法?我究竟做錯了什么?
謝謝
更新:也許理解這個問題很有用。真正的 MyObjectClass 在那里我發出事件:
public class MyObjectClass
{
... more code here ...
private IMyInterface _selectedItem;
public IMyInterface SelectedItem
{
get => _selectedItem;
set
{
IMyInterface oldSelectedItem = _selectedItem;
_selectedItem = value;
SelectedItemChanged?.Invoke(oldSelectedItem, _selectedItem);
SetProperty(ref _selectedItem, value);
}
}
public delegate void SelectedItemChange(IMyInterface oldItem, IMyInterface newItem);
public virtual SelectedItemChange SelectedItemChanged { get; set; }
}
然后我想從 C# 專案(我可以毫無問題地做到這一點)或 VB.NET 專案(我不能)訂閱該事件。
uj5u.com熱心網友回復:
這是因為 SelectedItemChange 不是事件。您需要將其宣告為事件
public event SelectedItemChange SelectedItemChange_Event;
您在 VB 中的 AddHanler 語法是正確的
uj5u.com熱心網友回復:
您的 C# 代碼一開始就是垃圾,這就是導致問題的原因。如果它寫得正確,那么你就沒有問題。如果這就是你所擁有的,那就是你必須忍受的。
如果SelectedItemChanged它只參考一個委托,那么只需創建一個委托并分配它,就像您對參考任何其他物件的任何其他屬性一樣:
MyObject.SelectedItemChanged = New SelectedItemChange(Sub(sender, args) DoSomething())
如果它可能參考多個委托,那么您可以顯式地執行 C# =運算子隱式執行的操作:
MyObject.SelectedItemChanged = [Delegate].Combine(MyObject.SelectedItemChanged, New SelectedItemChange(Sub(sender, args) DoSomething()))
值得注意的是,您的委托是使用兩個 type 引數具體宣告的IMyInterface。這意味著,在這段代碼中:
MyObject.SelectedItemChanged = (sender, args) => { DoSomething(); };
兩者sender和args都被推斷為該型別。它們不是objectand EventArgs,正如您為您的 VB 代碼所假設的那樣。這是 C# 代碼是垃圾的一個例子。
uj5u.com熱心網友回復:
試試這個:
Public Event SelectedItemChange_Event As SelectedItemChange
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/409728.html
標籤:
