यह काम करने के लिए प्रकट होता है, कम से कम उन प्रकारों पर, जिनके साथ मैंने इसका परीक्षण किया है।
उत्तीर्ण होने के लिए की जरूरत है PropertyInfo
संपत्ति में आपकी रुचि है के लिए, और यह भी Type
है कि संपत्ति पर परिभाषित किया गया है ( नहीं एक व्युत्पन्न या पेरेंट प्रकार है - यह सही प्रकार हो गया है):
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;
}
देखें इस दस्तावेज़ जानकारी के लिए।
सामान्य बात यह है कि या तो संपत्ति में स्वयं इस पर एक [Nullable]
विशेषता हो सकती है, या यदि यह संलग्न प्रकार नहीं है तो [NullableContext]
विशेषता हो सकती है । हम पहले खोजते हैं [Nullable]
, फिर यदि हम नहीं पाते हैं तो हम [NullableContext]
एनक्लोजिंग प्रकार पर देखते हैं।
कंपाइलर विशेषताओं को असेंबली में एम्बेड कर सकता है, और चूंकि हम एक अलग असेंबली से एक प्रकार देख रहे हैं, इसलिए हमें केवल-प्रतिबिंब लोड करने की आवश्यकता है।
[Nullable]
यदि संपत्ति सामान्य है, तो एक सरणी के साथ त्वरित किया जा सकता है। इस मामले में, पहला तत्व वास्तविक संपत्ति का प्रतिनिधित्व करता है (और आगे के तत्व सामान्य तर्कों का प्रतिनिधित्व करते हैं)। [NullableContext]
हमेशा एक ही बाइट के साथ त्वरित किया जाता है।
2
"शून्य" का अर्थ है। 1
का अर्थ है "अशक्त नहीं", और "विस्मृत" का 0
अर्थ है।
[NullableContext(2), Nullable((byte) 0)]
है ( ) - तो यह है कि क्या जांचना है, लेकिन मुझे यह समझने के लिए अधिक खुदाई करने की आवश्यकता है कि कैसे व्याख्या करें!Foo