2013-07-13 37 views
12

在一個項目中考慮以下代碼:爲什麼這個動態參數不起作用?

static void Main(string[] args) 
{ 
    DoSomething(new { Name = "Saeed" }); 
} 

public static void DoSomething(dynamic parameters) 
{ 
    Console.WriteLine(parameters.Name); 
} 

這就像一個魅力。但是,只要你這兩個功能分開成兩個不同的項目,該代碼就會中斷:

// This code is in a Console Application 
static void Main(string[] args) 
{ 
    ExternalClass.DoSomething(new { Name = "Saeed" }); 
} 

// However, this code is in a Class Library; Another project 
public class ExternalClass 
{ 

    public static void DoSomething(dynamic parameters) 
    { 
     Console.WriteLine(parameters.Name); 
    } 
} 

我在第二種情況下得到的錯誤是:

對象」不包含一個定義'Name'(RuntimeBinderException)

爲什麼我得到這個錯誤?什麼是替代方法?如何將一個動態參數傳遞給另一個庫中的方法,並以簡單的方式在那裏使用它?

注:我熟悉ExpandoObject,我不希望使用。

+0

上面的鏈接的搜索谷歌上搜索了10秒,想想吧:-) – zerkms

+0

@zerkms,謝謝你,怎麼樣我不擅長C#的關鍵字;)到google一下。 –

+0

也許:-)我的搜索請求是:「C#動態不同的項目」 PS:我沒有在C#這幾天制定並沒有使用'dynamic'要麼 – zerkms

回答

9

您的代碼使用匿名類型。本來是在一個LINQ有用選擇查詢表達式,在C#版本3.加入不幸的是,C#編譯器與輔助功能調節劑在匿名類型設置爲內部成員生成它們。可訪問性由CLR強制執行。在Linq中不是問題,因爲迭代器也將在同一個程序集中生成。在動態關鍵字中使用它們並沒有被設想,它被添加到後來的C#版本4中。

這意味着只要代碼全部在同一個程序集中,它就能正常工作。但是,只要您將對象傳遞給另一個程序集中的代碼,內部強制實施的限制就會啓動並進入kaboom。

只是簡單地宣稱一點公共類的解決辦法。 ExpandoObject的工作原理也增加了不必要的開銷。

+1

我想這不是一個好設計。但是,當然,我不熟悉C#語言和CLR的侷限性。感謝您的信息。 –