Como posso emitir um tipo .NET com duas propriedades que estão sobrecarregados apenas no tipo de retorno?

StackOverflow https://stackoverflow.com/questions/1509098

  •  19-09-2019
  •  | 
  •  

Pergunta

Eu preciso criar um tipo que tem duas propriedades com o mesmo nome, e só diferem no tipo de retorno. Dinamicamente emitir este tipo via reflexão é perfeitamente aceitável.

Algo parecido com isto:

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

Eu entendo que não posso consumir esta propriedade a partir de C # ou VB.NET ou muitas outras linguagens .NET.

Para evitar respostas que me explicar por que eu não quero fazer isso, deixe-me explicar porque eu preciso dele: eu preciso dele para reproduzir um bug

.

Mais especificamente, eu tenho um bug no AutoFixture onde um Moq de um tipo fará com que ele lançar uma exceção em certos casos. O problema é que o tipo emitida por Moq contém duas propriedades ambos chamados 'Mock', que diferem apenas no tipo de retorno.

Gostaria de reproduzir este cenário em um teste de unidade, mas eu prefiro não ter uma dependência em Moq apenas para essa única razão, então eu gostaria de reproduzir o comportamento internamente no conjunto de teste.

Foi útil?

Solução

Você pode ter 2 propriedades com o mesmo nome que diferem apenas pelo tipo, e você pode fazer isso sem emitir dinamicamente o tipo:

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

A saída desse código será:

X: System.Int32
X: System.String

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top