Bu, en azından test ettiğim türlerde işe yarıyor gibi görünüyor.
Sen geçmesi gerekiyor PropertyInfo
ayrıca ilgilendiğiniz özelliği için ve Type
bu ö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 2
vası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!