ইতিমধ্যে এখানে বেশ কয়েকটি ভাল উত্তর রয়েছে, যা সতর্কতা এবং এর কারণ ব্যাখ্যা করে। এগুলির বেশিরভাগ জেনেরিক ধরণের স্থির ক্ষেত্র থাকার মতো কিছু সাধারণত একটি ভুল ।
আমি ভেবেছিলাম যে এই বৈশিষ্ট্যটি কীভাবে কার্যকর হতে পারে তার উদাহরণ আমি যুক্ত করব, অর্থাত্ এমন একটি ক্ষেত্রে যেখানে আর-ওয়্যারিংকে দমন করার বিষয়টি বোঝায়।
আপনার কল্পনা করুন যে আপনার সত্তা-শ্রেণীর একটি সেট রয়েছে যা আপনি ক্রমিক করতে চান, এক্সএমএলকে বলুন। আপনি এটি ব্যবহার করে একটি সিরিয়ালাইজার তৈরি করতে পারেন new XmlSerializerFactory().CreateSerializer(typeof(SomeClass))
তবে তারপরে আপনাকে প্রতিটি ধরণের জন্য পৃথক সিরিয়ালাইজার তৈরি করতে হবে। জেনেরিক ব্যবহার করে, আপনি নিম্নলিখিতটি দিয়ে প্রতিস্থাপন করতে পারেন, যা সত্তা থেকে প্রাপ্ত জেনেরিক শ্রেণিতে আপনি রাখতে পারেন:
new XmlSerializerFactory().CreateSerializer(typeof(T))
যেহেতু আপনি যখনই কোনও নির্দিষ্ট ধরণের উদাহরণটি সিরিয়াল করার প্রয়োজন হচ্ছেন আপনি সম্ভবত নতুন সিরিয়ালাইজার তৈরি করতে চান না, আপনি এটি যুক্ত করতে পারেন:
public class SerializableEntity<T>
{
// ReSharper disable once StaticMemberInGenericType
private static XmlSerializer _typeSpecificSerializer;
private static XmlSerializer TypeSpecificSerializer
{
get
{
// Only create an instance the first time. In practice,
// that will mean once for each variation of T that is used,
// as each will cause a new class to be created.
if ((_typeSpecificSerializer == null))
{
_typeSpecificSerializer =
new XmlSerializerFactory().CreateSerializer(typeof(T));
}
return _typeSpecificSerializer;
}
}
public virtual string Serialize()
{
// .... prepare for serializing...
// Access _typeSpecificSerializer via the property,
// and call the Serialize method, which depends on
// the specific type T of "this":
TypeSpecificSerializer.Serialize(xmlWriter, this);
}
}
যদি এই শ্রেণিটি জেনেরিক না হয় তবে শ্রেণির প্রতিটি উদাহরণ একই ব্যবহার করবে _typeSpecificSerializer
।
যেহেতু এটি জেনেরিক, একই ধরণের উদাহরণগুলির একটি সেট T
একটি একক উদাহরণ ভাগ করবে _typeSpecificSerializer
(যা সেই নির্দিষ্ট ধরণের জন্য তৈরি করা হবে), অন্যদিকে বিভিন্ন ধরণের T
উদাহরণগুলি বিভিন্ন উদাহরণ ব্যবহার করবে _typeSpecificSerializer
।
একটি উদাহরণ
দুটি শ্রেণীর বিস্তৃত প্রসারিত SerializableEntity<T>
:
// Note that T is MyFirstEntity
public class MyFirstEntity : SerializableEntity<MyFirstEntity>
{
public string SomeValue { get; set; }
}
// Note that T is OtherEntity
public class OtherEntity : SerializableEntity<OtherEntity >
{
public int OtherValue { get; set; }
}
... আসুন সেগুলি ব্যবহার করুন:
var firstInst = new MyFirstEntity{ SomeValue = "Foo" };
var secondInst = new MyFirstEntity{ SomeValue = "Bar" };
var thirdInst = new OtherEntity { OtherValue = 123 };
var fourthInst = new OtherEntity { OtherValue = 456 };
var xmlData1 = firstInst.Serialize();
var xmlData2 = secondInst.Serialize();
var xmlData3 = thirdInst.Serialize();
var xmlData4 = fourthInst.Serialize();
এই ক্ষেত্রে, ফণা অধীনে, firstInst
এবং secondInst
একই শ্রেণীর উদাহরণস্বরূপ হবে (যথা SerializableEntity<MyFirstEntity>
), এবং যেমন, তারা একটি উদাহরণ ভাগ করবে _typeSpecificSerializer
।
thirdInst
এবং fourthInst
একটি ভিন্ন শ্রেণী (উদাহরণ স্বরূপ ধরে SerializableEntity<OtherEntity>
), এবং তাই একটি দৃষ্টান্ত ভাগ হবে _typeSpecificSerializer
যে বিভিন্ন অন্য দুটি থেকে।
এর অর্থ আপনি নিজের প্রতিটি সত্তার প্রকারের জন্য আলাদা আলাদা সিরিয়ালাইজার-দৃষ্টান্ত পান , তবে প্রতিটি প্রকৃত প্রকারের (যেমন, কোনও নির্দিষ্ট ধরণের উদাহরণগুলির মধ্যে ভাগ করে নেওয়া) প্রসঙ্গে তাদের স্থির রাখার পরেও।