[英]Can not get instance of type derived in F# library correctly
我的項目在 C# 庫中使用 F# 的類型時遇到問題。
我有一個基本上由以下主要部分組成的應用程序:
核心庫包含所有與平台無關的邏輯和視圖模型,可用於任何類型的 UI 客戶端。 該應用程序被設計為可擴展的,並且可以在加載 UI 之前動態插入擴展。 現在它只是通過Assembly.LoadFrom從特定文件夾加載DLL 。 將dll識別為擴展的唯一要求是公開派生自核心庫中定義的模塊或擴展類的特殊類。 在加載用 C# 編寫的程序集時,它工作得很好。 但是當我嘗試使用用 F# 編寫的擴展時,我遇到了非常奇怪的行為。 假設我有一個在我的核心庫中定義的接口IRecognitionProcessor 。 以下是它的一些成員:
public interface IRecognitionProcessor
{
string Name { get; }
string Description { get; }
bool ContainsFace(Bitmap bitmap);
FaceDetail[] ExtractDetails(Bitmap bitmap);
/* more members goes here */
}
在我為 .NET 提供基於EmguCV庫的自定義識別的新擴展中,我有一個IRecognitionProcessor的后代,結果將被提取並存儲在特殊容器中。 正如我之前提到的,該擴展是用 F# 編寫的。 這是實現的一個簡短示例:
type EmguFaceRecognition() =
interface IRecognitionProcessor with
member this.Name : string = "EmguCV"
member this.Description : string = "EmguCV face recognition processor"
member this.ContainsFace (bitmap : Bitmap) : bool =
//code goes here
member this.ExtractDetails (bitmap : Bitmap) : FaceDetail array =
//code goes here
// other implementations
它加載正確,沒有任何錯誤,並且它附帶的所有程序集也正常加載。 當我從附加的擴展中獲取所有處理器時,問題就出現了。 以下是描述模塊及其如何提供處理器的代碼的簡化表示:
type EmguRecognitionModule() =
inherit RecognitionModule()
override this.GetRecognitionProcessor() : IRecognitionProcessor =
new EmguFaceRecognition() :> IRecognitionProcessor
// more code goes here
加載新模塊時 - 它的處理器被提取並存儲在存儲器中。 通過Activator.CreateInstance實例化模塊和通過GetRecognitionProcessor方法獲取它的處理器這兩個步驟都可以正常工作。 這是填充我的視圖模型的處理器集合之一的方法:
public void PopulateRecognitionProcessors(IEnumerable<IRecognitionProcessor> processors, AccessToken accessToken)
{
if (accessToken != _parentAccessToken)
throw new AccessViolationException("Attempt to set recognition processors from outside of the parent");
_recognitionProcessors.Clear();
_recognitionProcessors.AddRange(processors);
SelectedProcessor = _recognitionProcessors.FirstOrDefault();
}
非常簡單,盡管當處理器來自 F# 庫時效果不佳。 即使有處理器, SelectedProcessor屬性也根本不會分配給第一個處理器,它仍然是null 。 當我放置斷點並嘗試觀察存儲在集合中的處理器的屬性時 - 檢查顯示沒有任何屬性。 這是我在 JetBrains Rider 中制作的屬性檢查示例的鏈接。 但是當我使用Evaluate窗口時,我可以訪問對象的所有屬性和方法,並且 IntelliSense 可以完美運行。 鏈接到帶有評估示例的圖像。 整個情況讓我感到愚蠢。 只是第一次遇到這個問題。 以前,我使用 F# 庫中定義的類型的所有嘗試都成功了。 但這次是個例外。 我看到使用從抽象類型派生的類型效果很好。 但是以某種方式實現接口的類型卻沒有。
在使用 F# 項目設置並從頭開始重新創建項目后,我終於設法解決了這個問題——盡管問題的根源仍然是個謎。
但是 Rider 的屬性檢查器仍然存在問題,它只顯示直接在接口后代中聲明的那些成員。 如果已經發布了類似的問題,我會查看 JetBrains 支持。
更新
似乎CheckBox的DisplayMemberPath (在XAML中指定)也無法從實例解析已實現的屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.