O C # 8.0 apresenta tipos de referência que permitem valor nulo. Aqui está uma classe simples com uma propriedade anulável:
public class Foo
{
public String? Bar { get; set; }
}
Existe uma maneira de verificar se uma propriedade de classe usa um tipo de referência anulável por meio de reflexão?
c#
reflection
nullable
nullable-reference-types
shadeglare
fonte
fonte
[NullableContext(2), Nullable((byte) 0)]
ao tipo (Foo
) - então é isso o que verificar, mas eu precisaria cavar mais para entender as regras de como interpretar isso!string? X
não obtém atributos estring Y
fica[Nullable((byte)2)]
com[NullableContext(2)]
os acessadoresNullableContext
. Se houver uma mistura,Nullable
use também.NullableContext
é uma otimização para tentar evitar a emissãoNullable
por todo o lugar.Respostas:
Parece funcionar, pelo menos nos tipos com os quais eu testei.
Você precisa passar
PropertyInfo
para a propriedade em que está interessado e também para aType
qual essa propriedade está definida ( não um tipo derivado ou pai - deve ser o tipo exato):Veja este documento para detalhes.
A essência geral é que a própria propriedade pode ter um
[Nullable]
atributo ou, se não, o tipo de fechamento pode ter um[NullableContext]
atributo. Primeiro procuramos e[Nullable]
, se não o encontrarmos, procuramos[NullableContext]
no tipo de anexo.O compilador pode incorporar os atributos ao assembly e, como podemos observar um tipo de um assembly diferente, precisamos fazer uma carga somente de reflexão.
[Nullable]
pode ser instanciado com uma matriz, se a propriedade for genérica. Nesse caso, o primeiro elemento representa a propriedade real (e outros elementos representam argumentos genéricos).[NullableContext]
é sempre instanciado com um único byte.Um valor de
2
significa "anulável".1
significa "não anulável" e0
significa "inconsciente".fonte
IBusinessRelation : ICommon {}
/public interface ICommon { string? Name {get;set;} }
. Se eu chamar o métodoIBusinessRelation
com a propriedadeName
, fico falso.ICommon
, nãoIBusinessRelation
. Cada interface define sua própriaNullableContext
. Esclarei minha resposta e adicionei uma verificação de tempo de execução para isso.