कुछ प्रयोग करने के बाद, मुझे पता चला कि आप अपने स्वयं के विवेचक सम्मेलनों को लिख सकते हैं। मैं वास्तव में क्यों नहीं समझ सकता, लेकिन डिफ़ॉल्ट भेदभावकर्ता सम्मेलन पूर्णनाम के बजाय प्रकार वर्ग की नाम संपत्ति का उपयोग करता प्रतीत होता है, जो इसे सामान्य वर्गों के लिए बेकार बनाता है।
मैंने इसके बजाय इस कोड का उपयोग करना समाप्त कर दिया:
class FooDiscriminatorConvention : IDiscriminatorConvention
{
public string ElementName
{
get { return "_t"; }
}
public Type GetActualType(MongoDB.Bson.IO.BsonReader bsonReader, Type nominalType)
{
if(nominalType!=typeof(MyAbstractClass))
throw new Exception("Cannot use FooDiscriminator for type " + nominalType);
var ret = nominalType;
var bookmark = bsonReader.GetBookmark();
bsonReader.ReadStartDocument();
if (bsonReader.FindElement(ElementName))
{
var value = bsonReader.ReadString();
ret = Type.GetType(value);
if(ret==null)
throw new Exception("Could not find type " + value);
if(!ret.IsSubclassOf(typeof(MyAbstractClass)))
throw new Exception("Database type does not inherit from MyAbstractClass.");
}
bsonReader.ReturnToBookmark(bookmark);
return ret;
}
public BsonValue GetDiscriminator(Type nominalType, Type actualType)
{
if (nominalType != typeof(MyAbstractClass))
throw new Exception("Cannot use FooDiscriminator for type " + nominalType);
return actualType.FullName;
}
}
और इसे
. के साथ पंजीकृत करनाBsonSerializer.RegisterDiscriminatorConvention(typeof(MyGenericClass<>), new FooDiscriminatorConvention()); //is this needed?
BsonSerializer.RegisterDiscriminatorConvention(typeof(MyAbstractClass), new FooDiscriminatorConvention());
"अमूर्त वर्गों के उदाहरणों को क्रेट नहीं कर सकता" त्रुटि से बचने के लिए मुझे बेस क्लास को गैर-सार बनाना पड़ा। एक सार आधार वर्ग प्राप्त करने में सक्षम होना अच्छा होगा, लेकिन चूंकि व्युत्पन्न वर्ग सामान्य है, इसलिए मैं BsonKnownTypes का उपयोग नहीं कर सकता।