[英]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.