2009-10-02 5 views
11

Je dois créer un type qui a deux propriétés avec le même nom, et ne différer que par le type de retour. L'émission dynamique de ce type par réflexion est parfaitement acceptable.Comment puis-je émettre un type .NET avec deux propriétés qui sont surchargées uniquement sur le type de retour?

Quelque chose comme ceci:

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

Je comprends que je ne peux pas consommer cette propriété de C# ou VB.NET ou beaucoup d'autres langages .NET.

Pour éviter les réponses qui m'expliquent pourquoi je ne veux pas faire cela, laissez-moi vous expliquer pourquoi j'en ai besoin: j'en ai besoin pour reproduire un bug.

Plus précisément, j'ai un bogue dans AutoFixture où un Moq d'un type lui fera lever une exception dans certains cas. Le problème est que le type émis par Moq contient deux propriétés nommées 'Mock' qui ne diffèrent que par le type de retour. Je souhaite reproduire ce scénario dans un test unitaire, mais je préfère ne pas dépendre de Moq pour cette seule raison, donc je souhaite reproduire le comportement en interne dans la suite de tests.

+6

+1 pour donner des raisons valables pour ce qui serait autrement « pied, but, sh oot "type de matériel :) –

Répondre

14

Vous pouvez avoir 2 propriétés avec le même nom qui ne diffèrent que par le type, et vous pouvez le faire sans émettre de façon dynamique le type:

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

La sortie de ce code sera:

X: System.Int32
X: System.String

+0

C'était exactement ce dont j'avais besoin pour reproduire le bug. Merci beaucoup :) –

Questions connexes