2009-10-02 10 views
11

Potrzebuję utworzyć typ, który ma dwie właściwości o tej samej nazwie i różnią się tylko w typie zwracanym. Dynamiczne emitowanie tego typu za pomocą odbicia jest całkowicie dopuszczalne.Jak mogę emitować typ .NET z dwiema właściwościami, które są przeciążone tylko dla typu zwracanego?

coś takiego:

public TypeA Prop { get; } 
public TypeB Prop { get; } 

Rozumiem, że nie mogę spożywać tę właściwość z C# lub VB.NET i wiele innych języków .NET.

Aby uniknąć odpowiedzi wyjaśniających, dlaczego nie chcę tego zrobić, pozwól mi wyjaśnić, dlaczego jest to potrzebne: potrzebuję go do odtworzenia błędu.

Dokładniej, mam błąd w AutoFixture, gdzie Moq typu spowoduje, że w niektórych przypadkach wygeneruje wyjątek. Problem polega na tym, że typ emitowany przez Moq zawiera dwie właściwości o nazwie "Mock", które różnią się tylko typem zwracanym.

Chciałbym odtworzyć ten scenariusz w teście jednostkowym, ale wolałbym nie uzależniać się od Moq tylko z tego jednego powodu, więc chciałbym odtworzyć to zachowanie wewnętrznie w pakiecie testowym.

+6

+1 za udzielenie uzasadnione powody do tego, co byłoby inaczej „foot, cel, sh o "typ materiału :) –

Odpowiedz

14

Można mieć 2 nieruchomości o tej samej nazwie, które różnią się tylko typem, a można to zrobić bez dynamicznie emitujące typ:

class Foo 
{ 
    public string X 
    { 
     get { return "Hello world"; } 
    } 
} 

class Bar : Foo 
{ 
    public new int X 
    { 
     get { return 42; } 
    } 
} 

void Main() 
{ 
    foreach(PropertyInfo prop in typeof(Bar).GetProperties()) 
    { 
     Console.WriteLine("{0} : {1}", prop.Name, prop.PropertyType); 
    } 
} 

Wyjście z tego kodu będzie:

X: System.Int32
X: System.String

+0

To było dokładnie to, czego potrzebowałem do odtworzenia błędu. Wielkie dzięki :) –

Powiązane problemy