2013-07-13 15 views
12

Rozważmy następujący kod w projekcie:Dlaczego ten parametr dynamiczny nie działa?

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

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

To działa jak czar. Jednakże, jak najszybciej oddzielić te dwie funkcje w dwóch różnych projektów, kod przełamuje:

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

Błąd pojawia się w drugim przypadku jest:

obiekt”nie zawierają definicji "Nazwa" (RuntimeBinderException)

Dlaczego pojawia się ten błąd? Jaka jest alternatywna metoda? Jak mogę przekazać dynamiczny parametr do metody w innej bibliotece i użyć go w prosty sposób?

Uwaga: znam ExpandoObject i nie chcę tego używać.

+0

Szukanie powyższego linku zajęło 10 sekund googlowania, pomyśl :-) – zerkms

+0

@zerkms, dziękuję, co powiesz na to, że nie byłem dobry w C# słowach kluczowych;) google to. –

+0

Możliwe :-) Moja prośba o wyszukanie brzmiała: "C# dynamiczny inny projekt" PS: Nie rozwijam się w C# obecnie i nie używałem 'dynamic' albo – zerkms

Odpowiedz

9

Twój kod wykorzystuje anonimowy typ . Pierwotnie przeznaczone do użycia w wyrażeniu zapytania Linq select, dodane w C# wersji 3. Niestety, kompilator C# generuje je z modyfikatorem dostępności dla elementów w typie anonimowym ustawionym na wewnętrzny. Dostępność jest egzekwowana przez CLR. Nie jest to problemem w Linq, ponieważ iterator będzie generowany również w tym samym zespole. Używanie ich ze słowem kluczowym nie było przewidywane, zostało dodane w późniejszej wersji C#, wersja 4.

Co oznacza, że ​​będzie działać poprawnie, dopóki cały kod znajduje się w tym samym zespole. Jednakże, gdy tylko przekażesz obiekt do zakodowania w innym zestawie, ograniczenia wymuszone przez wewnętrzne zostaną podciągnięte i nastąpi przejście kaboom.

Po prostu ogłaszamy małą publiczną lekcję. ExpandoObject działa również, ale dodaje niepotrzebne obciążenie.

+1

Myślę, że to nie jest dobry projekt. Ale oczywiście nie jestem zaznajomiony z ograniczeniami języka C# i CLR. Dzięki za informację. –

Powiązane problemy