簡體   English   中英

C#:從反射返回強類型

[英]C#: return stong types from reflection

在最新版本的C#中,如果事先知道類型,是否可以將動態類型轉換為強類型?

我正在使用反射在 object 上調用一個方法,該方法返回一個 var:

var returnVal = context.GetType().InvokeMember(MethodName, BindingFlags.InvokeMethod, null, context, lParams.ToArray());

我可以輕松地將類型返回到returnVal 是否可以將變薄轉換為更強類型的版本?

編輯清晰:

在這種情況下,我知道返回的類型,但只知道字符串。 要獲得類型,我必須這樣做:

diAssemblies[k].GetType(diAssemblies[k].GetName().Name + "." + returnType)

returnType是要返回的類型的名稱。

理想情況下,我希望能夠將方法調用的結果放入強類型字段中。

語境

我正在從目錄加載包含 .edmx 文件的程序集,然后在這些上下文中調用方法。 在運行時,加載程序不知道它將加載哪些程序集。 但是,使用加載器的人會知道程序集、方法和類型。

這是通過實體框架(使用存儲過程)圍繞數據庫調用創建一個通用包裝器,該包裝器將在其他地方重用。

如果您不知道靜態類型,如何使用靜態類型引用? 可以做的是讓返回的類型靜態地實現您知道的接口,然后強制轉換為該接口。

因此,如果 MyStrongType 實現 IMyStrongBehavior,您可以將返回值強制轉換為 IMyStrongBehavior 並靜態使用它。 基礎值已經是強類型的,無論您是否強制轉換它。

或者,您可以將返回值存儲在dynamic變量中(這將允許您在沒有實際靜態類型接口的情況下調用已知方法。)這里的缺點是您沒有得到任何 Intellisense 並且您犯的任何錯誤都不會顯示到運行時。

不,您無法獲得具體類型的優勢,例如編譯時檢查和智能感知。 這是因為您實際上只是在運行時確定類型是什么。 它是后期綁定的,這意味着它是動態和 DLR 的工作。 您可以將其轉換為您知道實際 object 將從(例如對象)繼承的 object,但您不能轉換為實際類型。 如果您有以下情況,您可能需要查看 generics 作為替代方案:

public T GetReturnVal<T>()
{
   return (T)context.GetType().InvokeMember(MethodName, BindingFlags.InvokeMethod, null, context, lParams.ToArray());
}

您至少會向 T 類型的調用者返回一個具體類型。但是這種類型必須在編譯時設置,即提前知道。

我建議您閱讀C# Generics 簡介,因為從您添加的上下文來看,它確實是您需要做的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM