Qual é a maneira mais simples de testar se um objeto implementa uma determinada interface em C #? (Responda a esta pergunta em Java )
c#
reflection
interface
JoshRivers
fonte
fonte
if (object is IBlah iblah) { iblah.SomeMethod(); }
Usar os operadores
is
ouas
é a maneira correta se você souber o tipo de interface no momento da compilação e tiver uma instância do tipo que está testando. Algo que ninguém mais parece ter mencionado éType.IsAssignableFrom
:Eu acho que isso é muito melhor do que olhar através da matriz retornada
GetInterfaces
e tem a vantagem de trabalhar para as classes também.fonte
typeof(IList).IsAssignableFrom(someType)
, sem o<>
.Para a instância:
Para a turma:
Verifique se
typeof(MyClass).GetInterfaces()
contém a interface.fonte
Se você deseja usar o objeto de conversão de tipo após a verificação:
Desde o C # 7.0:
É o mesmo que
Consulte .NET Docs: correspondência de padrões com o
is
padrão # Typefonte
Uma variação na resposta de @ AndrewKennan que acabei usando recentemente para tipos obtidos em tempo de execução:
fonte
Este post é uma boa resposta.
Este é um exemplo simples:
ou
fonte
Além de testar usando o operador "is", você pode decorar seus métodos para garantir que as variáveis transmitidas a ele implementem uma interface específica, como:
Não tenho certeza em qual versão do .Net foi implementada, portanto, pode não funcionar na sua versão.
fonte
O que funcionou para mim é:
Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));
fonte
Recentemente, tentei usar a resposta de Andrew Kennan e não funcionou para mim por algum motivo. Eu usei isso em vez disso e funcionou (nota: pode ser necessário escrever o espaço para nome).
fonte
eu usei
Assert.IsTrue(myObject is ImyInterface);
para um teste no meu teste de unidade que testa que myObject é um objeto que implementou minha interface ImyInterface.
fonte
Eu tive uma situação em que estava passando uma variável para um método e não tinha certeza se seria uma interface ou um objeto.
Os objetivos foram:
Consegui isso com o seguinte:
fonte
Isso deve funcionar:
Mas legal também:
Ou até (não muito elegante):
fonte