2010-09-20 58 views
1

我試圖將WPF入門工具從C#轉換爲VB.net,除了一個區域外,我做得非常好......使用Unity應用程序的依賴注入塊。Unity應用程序塊 - 從C#轉換爲VB示例

我有下面的C#代碼塊:

  Type viewModelType = viewModelAssembly.GetType(action.ViewModelTypeName); 

      var notificationPolicy = unity.AddNewExtension<Interception>() 
       .RegisterType(typeof(BaseViewModel), viewModelType, action.Name) 
       .Configure<Interception>() 
       .SetDefaultInterceptorFor(viewModelType, new VirtualMethodInterceptor()) 
       .AddPolicy("NotificationPolicy"); 

      notificationPolicy.AddMatchingRule(new PropertyMatchingRule("*", PropertyMatchingOption.Set)); 
      notificationPolicy.AddCallHandler<NotifyPropertyChangedCallHandler>(); 

那我自動轉換到vb.net:

Dim viewModelType As Type = viewModelAssembly.[GetType](action.ViewModelTypeName) 

Dim notificationPolicy = unity.AddNewExtension(Of Interception()).RegisterType(GetType(BaseViewModel), viewModelType, action.Name).Configure(Of Interception)().SetDefaultInterceptorFor(viewModelType, New VirtualMethodInterceptor()).AddPolicy("NotificationPolicy") 

notificationPolicy.AddMatchingRule(New PropertyMatchingRule("*", PropertyMatchingOption.[Set])) 
notificationPolicy.AddCallHandler(Of NotifyPropertyChangedCallHandler)() 

的vb.net代碼生成錯誤「後期綁定重載決策不能應用於'RegisterType'因爲訪問實例是一個接口類型「,我不知道如何解決這個問題。我對這個Unity的東西完全陌生,除了MS提供的片段外,我無法找到vb的例子。任何幫助將不勝感激。

感謝所有,

瑞安

編輯:每布拉姆,我添加了額外的支架,但我仍然得到同樣的錯誤。

回答

1

我沒有看到如何編譯當它缺少一個支架:

Dim notificationPolicy = unity.AddNewExtension(Of Interception()) _ 
.RegisterType(GetType(BaseViewModel), viewModelType, action.Name) _ 
.Configure(Of Interception)() _ 
.SetDefaultInterceptorFor(viewModelType, New VirtualMethodInterceptor()) _ 
.AddPolicy("NotificationPolicy") 

支架是在這裏:

AddNewExtension(攔截() .Register ...

0

你的VB代碼看起來沒問題。這裏可能有兩個不同的問題。首先,你使用的是Unity 2.0嗎?您的.vb文件的頂部是否有「Imports Microsoft.Practices.Unity」? RegisterType上的大部分重載都被定義爲接口上的擴展方法,沒有這個Imports語句,編譯器不會看到它們。

第二個問題可能是這一行:

昏暗notificationPolicy = ...

注意這裏沒有類型,所以VB有猜測。默認情況下,我認爲它是猜對象,並且會回落到晚期的東西。

這裏有幾個選項。

首先,將「Option Infer On」添加到.vb文件的頂部。這將打開類型推斷。

如果這不起作用,請更改代碼以聲明類型。在這種情況下,它會是:

昏暗notificationPolicy爲PolicyDefinition = ...

或者最後,你可以簡單的代碼的最後兩行鏈在一起,忘記了變量。做這個,而不是:

unity.AddNewExtension(Of Interception()) _ 
    .RegisterType(GetType(BaseViewModel), viewMOdelType, action.Name) _ 
    .Configure(Of Interception)() _ 
    .SetDefaultInterceptorFor(viewModelType, new VirtualMethodInterceptor()) _ 
    .AddPolicy("NotificationPolicy") _ 
     .AddMatchingRule(new PropertyMatchingRule("*", PropertyMatchingOption.[Set])) _ 
     .AddCallHandler(Of NotifyPropertyChangedCallHandler)() 

希望這會有所幫助。

0

我使用紅門反射器來查看代碼在不同語言中的外觀。雖然有時它不會產生最好看的代碼。