যদি কোনও শ্রেণি / ইন্টারফেস উত্তরাধিকার সূত্রে / প্রয়োগ করে তবে পরীক্ষার কোনও উপায় আছে কি?
private void MyGenericClass<T> ()
{
if(T ... inherits or implements some class/interface
}
যদি কোনও শ্রেণি / ইন্টারফেস উত্তরাধিকার সূত্রে / প্রয়োগ করে তবে পরীক্ষার কোনও উপায় আছে কি?
private void MyGenericClass<T> ()
{
if(T ... inherits or implements some class/interface
}
উত্তর:
T inherits U
আসলে অনুবাদ typeof(T).IsAssignableFrom(typeof(U))
।
T
অন্য কোনও ধরণের সীমাবদ্ধ থাকে TOther
, তবে মৃত্যুদন্ড কার্যকর করার পরে, typeof(T)
আপনি প্রকৃতপক্ষে typeof(TOther)
যে প্রকারটি T
উত্তীর্ণ হয়েছিল তা মূল্যায়ন করে না এবং সে ক্ষেত্রে typeof(SomeInterface).IsAssignableFrom(typeof(T))
ব্যর্থ হবে (ধরে TOther
নিলে বাস্তবায়ন হয় না SomeInterface
), যদিও আপনার কংক্রিটের ধরণটি কার্যকর করেছে SomeInterface
।
IsAssignableFrom
এর TypeInfo
বর্গ শুধুমাত্র এটা একমাত্র আর্গুমেন্ট হিসাবে TypeInfo গ্রহণ তাই নমুনা নিম্নলিখিত হওয়া উচিত:typeof(Employee).GetTypeInfo().IsAssignableFrom(typeof(T).GetTypeInfo())
আপনি ক্লাসে সীমাবদ্ধতা ব্যবহার করতে পারেন।
MyClass<T> where T : Employee
Http://msdn.microsoft.com/en-us/library/d5x73970.aspx এ একবার দেখুন
আপনি যদি সংকলনের সময় পরীক্ষা করতে চান: ত্রুটিটি যদি পছন্দসই ইন্টারফেস / শ্রেণি প্রয়োগ T
না করে তবে আপনি নিম্নলিখিত সীমাবদ্ধতাটি ব্যবহার করতে পারেন
public void MyRestrictedMethod<T>() where T : MyInterface1, MyInterface2, MySuperClass
{
//Code of my method here, clean without any check for type constraints.
}
আমি আশা করি এটি সাহায্য করবে.
সঠিক বাক্য গঠন
typeof(Employee).IsAssignableFrom(typeof(T))
রিটার্ন মান:
true
যদিc
ও বর্তমানType
একই ধরনের প্রতিনিধিত্ব, অথবা বর্তমান যদিType
উত্তরাধিকার অনুক্রমের হয়c
, অথবা যদি বর্তমানType
একজনinterface
যেc
কার্যকরী, অথবা যদিc
একটি জেনেরিক টাইপ প্যারামিটার এবং বর্তমানType
সীমাবদ্ধতার এক প্রতিনিধিত্ব করেc
, অথবা যদিc
কোনও মান ধরণের প্রতিনিধিত্ব করে এবং বর্তমানType
উপস্থাপন করেNullable<c>
(Nullable(Of c)
ভিজ্যুয়াল বেসিক)।false
যদি এই শর্তগুলির কোনওটি না হয়true
বাc
হয়null
।
তাহলে Employee IsAssignableFrom T
তারপর T
থেকে উত্তরাধিকারী Employee
।
ব্যবহার
typeof(T).IsAssignableFrom(typeof(Employee))
true
কেবল তখনই ফিরে আসে
T
এবং Employee
একই ধরণের প্রতিনিধিত্ব করে; বা,Employee
থেকে উত্তরাধিকারী T
।এটি কিছু ক্ষেত্রে ব্যবহারের উদ্দেশ্যে হতে পারে তবে মূল প্রশ্নটির (এবং আরও সাধারণ ব্যবহারের) জন্য, কখন T
উত্তরাধিকারী হয় বা কিছু প্রয়োগ করে class
/ তা প্রয়োগ করে interface
:
typeof(Employee).IsAssignableFrom(typeof(T))
প্রত্যেকের সত্যিকারের অর্থ হ'ল:
typeof(BaseType).IsAssignableFrom(typeof(DerivedType)) // => true
আপনি আক্ষরিক পারবেন না কারণ থেকে বরাদ্দ একটি একটি দৃষ্টান্ত DerivedType
একটি একটি দৃষ্টান্ত থেকে BaseType
:
DerivedType childInstance = new DerivedType();
BaseType parentInstance = childInstance; // okay, assigning base from derived
childInstance = (DerivedType) parentInstance; // not okay, assigning derived from base
কখন
public class BaseType {}
public class DerivedType : BaseType {}
এবং যদি আপনার চারপাশে আপনার মাথা গুটিয়ে রাখতে সমস্যা হয় তবে কয়েকটি দৃ concrete় উদাহরণ:
(লিনকপ্যাডের মাধ্যমে, সুতরাং HorizontalRun
এবং Dump
)
void Main()
{
// http://stackoverflow.com/questions/10718364/check-if-t-inherits-or-implements-a-class-interface
var b1 = new BaseClass1();
var c1 = new ChildClass1();
var c2 = new ChildClass2();
var nb = new nobase();
Util.HorizontalRun(
"baseclass->baseclass,child1->baseclass,baseclass->child1,child2->baseclass,baseclass->child2,nobase->baseclass,baseclass->nobase",
b1.IsAssignableFrom(typeof(BaseClass1)),
c1.IsAssignableFrom(typeof(BaseClass1)),
b1.IsAssignableFrom(typeof(ChildClass1)),
c2.IsAssignableFrom(typeof(BaseClass1)),
b1.IsAssignableFrom(typeof(ChildClass2)),
nb.IsAssignableFrom(typeof(BaseClass1)),
b1.IsAssignableFrom(typeof(nobase))
).Dump("Results");
var results = new List<string>();
string test;
test = "c1 = b1";
try {
c1 = (ChildClass1) b1;
results.Add(test);
} catch { results.Add("FAIL: " + test); }
test = "b1 = c1";
try {
b1 = c1;
results.Add(test);
} catch { results.Add("FAIL: " + test); }
test = "c2 = b1";
try {
c2 = (ChildClass2) b1;
results.Add(test);
} catch { results.Add("FAIL: " + test); }
test = "b1 = c2";
try {
b1 = c2;
results.Add(test);
} catch { results.Add("FAIL: " + test); }
results.Dump();
}
// Define other methods and classes here
public static class exts {
public static bool IsAssignableFrom<T>(this T entity, Type baseType) {
return typeof(T).IsAssignableFrom(baseType);
}
}
class BaseClass1 {
public int id;
}
class ChildClass1 : BaseClass1 {
public string name;
}
class ChildClass2 : ChildClass1 {
public string descr;
}
class nobase {
public int id;
public string name;
public string descr;
}
বেসক্লাস-> বেসক্লাস
সত্য
চাইল্ড 1-> বেসক্লাস
মিথ্যা
বেসক্লাস-> চাইল্ড 1
সত্য
চাইল্ড 2-> বেসক্লাস
মিথ্যা
বেসক্লাস-> চাইল্ড 2
সত্য
nobase-> বেসক্লাস
মিথ্যা
বেসক্লাস-> নোবেস
মিথ্যা
এবং
- ব্যর্থ: সি 1 = বি 1
- বি 1 = সি 1
- ব্যর্থ: সি 2 = বি 1
- বি 1 = সি 2
যদিও অন্যরা বলেছে যে ইসএইসনেবলফ্রম হ'ল সর্বোত্তম উপায়, যদি আপনার কেবলমাত্র কোনও শ্রেণি অন্যের কাছ থেকে উত্তরাধিকার সূত্রে আসে কিনা তা পরীক্ষা করে দেখার দরকার হয় তবে কাজটিও typeof(T).BaseType == typeof(SomeClass)
খুব কার্যকর।
SomeClass
সরাসরি থেকে প্রাপ্ত না হলে কাজ করে BaseClass
।
বিকল্প উপায়ে জানাতে একটি বস্তু যদি o
একটি বর্গ বা কার্যকরী উত্তরাধিকারী একটি ইন্টারফেস ব্যবহার করা is
এবং as
অপারেটর।
যদি আপনি কেবল জানতে চান যে কোনও বস্তু কোনও শ্রেণীর উত্তরাধিকার সূত্রে আসে বা কোনও ইন্টারফেস প্রয়োগ করে তবে is
অপারেটর একটি বুলিয়ান ফলাফল প্রদান করবে:
bool isCompatibleType = (o is BaseType || o is IInterface);
যদি আপনি পরীক্ষার পরে উত্তরাধিকার সূত্রে প্রাপ্ত শ্রেণি বা প্রয়োগকৃত ইন্টারফেসটি ব্যবহার করতে চান তবে as
অপারেটর একটি উত্তরাধিকার সূত্রে প্রাপ্ত উত্তরাধিকারী শ্রেণীর একটি রেফারেন্স ফিরিয়ে আনবে বা প্রয়োগযোগ্য ইন্টারফেসের সাথে সামঞ্জস্যপূর্ণ না হলে সামঞ্জস্যপূর্ণ বা নাল না হলে:
BaseType b = o as BaseType; // Null if d does not inherit from BaseType.
IInterface i = o as IInterface; // Null if d does not implement IInterface.
আপনার যদি কেবল টাইপ থাকে T
তবে @ নাইকির উত্তরটি ব্যবহার করুন।