簡體   English   中英

嘗試使用 Activator.CreateInstance(MyType)

[英]Trying to use Activator.CreateInstance(MyType)

我有以下問題:

public class MyType
{
    public void method(int a, params object[] p){} 
    public void MyType()
    {
        method(5);
    }
}

當我使用構造函數時,一切都很好,但是當我嘗試使用Activator.CreateInstance(MyType);

void Factory()
{
    string componentPath = "MyType.dll";
    Assembly component = Assembly.LoadFrom(componentPath);
    Type myType= component.GetType("MyType");
    Activator.CreateInstance(myType);
}

它失敗並出現異常MyType.method(int32) is not found。 重要的是要注意,在我將params object[] p添加到方法之前,一切正常。

謝謝你。

如果您使用帶有可選參數的方法或帶有params的方法來傳遞可變數量的參數,那么您所做的是告訴編譯器當您調用該方法時,它會為您插入必要的參數嗎? 可選參數和參數 arrays 插入調用代碼,而不是被調用代碼。 (有關可選參數的詳細說明,請參閱 Eric Lipperts 的一篇博客文章)。

您沒有使用 C# 編譯器,反射 API 不會為您插入這些參數。 例如,您不僅可以通過反射進行測試,還可以使用兩個程序集進行測試: 程序集 A 聲明method(int X) 它被編譯並且 dll 被程序集 B 引用。這個程序集 B 包含對method(42)的調用。 這工作正常,現在,如果您重新編譯程序集 A 並將簽名更改method(int X, object bla=null)method(int X, params object[] blas) ,那么程序集 B 停止工作 - 它包含無效調用. 即便如此,程序集 B 的源代碼仍然可以 - 您只需要重新編譯即可。

反射只是碰巧沒有為您做任何可選參數魔術。 可以,當然 - 但它沒有。 雖然反射不支持這一點,但 DLR 支持,這讓我想到了以下內容......

解決方法:嘗試使用 C# 關鍵字dynamic ,如果可能的話(對於構造函數,它不是 AFAIK) - 嘗試更緊密地模擬 C# 調用約定並支持諸如可選和命名參數之類的東西。 您可能需要更改 API 的設置方式,但要使用方法而不是構造函數。 如果沒有看到實際代碼,很難給出更准確的建議。

或者:從外觀上看,您可能正在嘗試加載插件。 .NET 有一些預制的基礎設施可以幫助您解決這個問題:插件和可擴展性,這可能會使您的任務更輕松。

(注意:您的示例代碼不完整 - 我略微猜測該method實際上是一個構造函數,但您應該真正發布實際代碼或至少一個實際失敗的片段)。

這是行不通的,因為您必須在對 method() 的調用中傳遞至少 2 個參數。 params修飾符並不意味着“可選”。

暫無
暫無

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

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