Bu, en azından test ettiğim türlerde işe yarıyor gibi görünüyor.
Sen geçmesi gerekiyor PropertyInfoayrıca ilgilendiğiniz özelliği için ve Typebu özellik üzerinde tanımlanan ( değil türetilmiş bir ya da ebeveyn tipi - bu kesin türü olmak zorunda):
public static bool IsNullable(Type enclosingType, PropertyInfo property)
{
if (!enclosingType.GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).Contains(property))
throw new ArgumentException("enclosingType must be the type which defines property");
var nullable = property.CustomAttributes
.FirstOrDefault(x => x.AttributeType.FullName == "System.Runtime.CompilerServices.NullableAttribute");
if (nullable != null && nullable.ConstructorArguments.Count == 1)
{
var attributeArgument = nullable.ConstructorArguments[0];
if (attributeArgument.ArgumentType == typeof(byte[]))
{
var args = (ReadOnlyCollection<CustomAttributeTypedArgument>)attributeArgument.Value;
if (args.Count > 0 && args[0].ArgumentType == typeof(byte))
{
return (byte)args[0].Value == 2;
}
}
else if (attributeArgument.ArgumentType == typeof(byte))
{
return (byte)attributeArgument.Value == 2;
}
}
var context = enclosingType.CustomAttributes
.FirstOrDefault(x => x.AttributeType.FullName == "System.Runtime.CompilerServices.NullableContextAttribute");
if (context != null &&
context.ConstructorArguments.Count == 1 &&
context.ConstructorArguments[0].ArgumentType == typeof(byte))
{
return (byte)context.ConstructorArguments[0].Value == 2;
}
// Couldn't find a suitable attribute
return false;
}
Ayrıntılar için bu belgeye bakın.
Genel [Nullable]öznitelik, ya özelliğin kendisinde bir özniteliğe sahip olabileceği ya da içermeyen türde bir [NullableContext]özniteliğe sahip olabileceğidir . Önce ararız [Nullable], o zaman bulamazsak [NullableContext], kapalı tipte ararız.
Derleyici öznitelikleri derlemeye gömebilir ve farklı bir derlemeden bir türe baktığımız için, yalnızca yansıma yükü yapmamız gerekir.
[Nullable]özellik genelse bir dizi ile başlatılabilir. Bu durumda, ilk öğe gerçek özelliği temsil eder (ve diğer öğeler genel bağımsız değişkenleri temsil eder). [NullableContext]her zaman tek bir bayt ile başlatılır.
Değeri 2vasıtası "olabilecek". 1"boş bırakılamaz" ve 0"kayıtsız" anlamına gelir.
[NullableContext(2), Nullable((byte) 0)]göre tip (Foo) - böylece kontrol etmek ama bunu nasıl yorumlanacağı kurallarını anlamak için daha derinlere inmek gerekiyordu neyi en!