2013-07-13 20 views
12

diesen Code in einem Projekt vor:Warum funktioniert dieser dynamische Parameter nicht?

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

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

Dies funktioniert wie ein Charme. Aber sobald Sie diese beiden Funktionen in zwei verschiedenen Projekten zu trennen, wird der Code bricht:

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

Der Fehler, den ich im zweiten Fall erhalten ist:

Objekt‘enthält keine Definition für 'Name' (RuntimeBinderException)

Warum bekomme ich diesen Fehler? Was ist die alternative Methode? Wie kann ich einen dynamischen Parameter an eine Methode in einer anderen Bibliothek übergeben und dort auf einfache Weise verwenden?

Hinweis: Ich bin vertraut mit ExpandoObject und ich möchte das nicht verwenden.

+0

Die Suche nach dem obigen Link dauerte 10 Sekunden googeln, darüber nachdenken :-) – zerkms

+0

@zerkms, danke, wie wäre es, ich war nicht gut bei C# keywords;) googeln. –

+0

vielleicht :-) meine Suchanfrage war: "C# dynamisches anderes Projekt" PS: Ich entwickle nicht in C# in diesen Tagen und habe 'dynamic' weder verwendet – zerkms

Antwort

9

Ihr Code verwendet einen anonymen Typ. Ursprünglich gedacht, in einem Linq nützlich zu sein, wählen Sie Query-Ausdruck, in C# Version 3 hinzugefügt. Leider generiert der C# -Compiler sie mit dem Accessibility-Modifizierer für die Mitglieder im anonymen Typ auf internen festgelegt. Die Barrierefreiheit wird von der CLR erzwungen. Kein Problem in Linq, da der Iterator auch in derselben Assembly generiert wird. Verwenden sie mit dem dynamische Schlüsselwort wurde nicht vorgesehen, wurde es in einer späteren C# Version, Version 4 hinzugefügt.

Das bedeutet, dass es gut funktioniert, solange der Code alle in der gleichen Baugruppe ist. Sobald Sie jedoch das Objekt übergeben, um es in einer anderen Baugruppe zu codieren, treten die durch internen erzwungenen Beschränkungen ein und es geht Kaboom.

Eine einfache öffentliche Klasse deklarieren ist die Problemumgehung. ExpandoObject funktioniert auch, fügt jedoch unnötigen Overhead hinzu.

+1

Ich denke, es ist kein gutes Design. Aber natürlich kenne ich die Einschränkungen von C# -Sprache und CLR nicht. Danke für die Information. –

Verwandte Themen