2013-07-13 15 views
12

は、プロジェクトにこのコードを考えてみましょう:この動的パラメータが機能しない理由を教えてください。

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

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

これは魔法のように動作します。しかし、できるだけ早くあなたがこれらの二つの機能を分離ように2つの異なるプロジェクト、コードブレークへ:

// 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); 
    } 
} 

私は後者の場合には取得するエラーは、次のとおりです。

オブジェクトは」の定義が含まれていません'名前'(RuntimeBinderException)

なぜこのエラーが発生しますか?代わりの方法は何ですか?別のライブラリのメソッドに動的パラメータを渡すにはどうしたらいいですか?

注:私はExpandoObjectに精通しており、使用したくありません。

+0

上記のリンクを検索すると、10秒のグーグルが発生しました。それについて考えてみましょう:-) – zerkms

+0

@zerkms、ありがとう、私はC#のキーワードでうまくいかなかったのですか? –

+0

おそらく:-)私の検索リクエストは「C#dynamic different project」でした。PS:最近はCで開発されておらず、「動的」は使われていません – zerkms

答えて

9

あなたのコードは匿名タイプを使用しています。 C#コンパイラは、残念なことに、匿名型のメンバのアクセシビリティ修飾子を内部に設定してそれらを生成します。アクセシビリティはCLRによって実施されます。同じアセンブリでもイテレータが生成されるため、Linqでは問題ありません。 動的キーワードでの使用は想定されていませんでした。これは後のC#バージョン、バージョン4で追加されました。

つまり、コードがすべて同じアセンブリ内にある限り正常に動作します。ただし、オブジェクトを他のアセンブリのコードに渡すとすぐに、内部のの制限が適用され、kaboomになります。

少しパブリッククラスを宣言するだけで回避できます。 ExpandoObjectも機能しますが、不要なオーバーヘッドが追加されます。

+1

私はそれが良いデザインではないと思う。もちろん、私はC#言語とCLRの限界に精通していません。情報のおかげで。 –

関連する問題