'টি' বর্গ / ইন্টারফেস উত্তরাধিকার সূত্রে প্রাপ্ত বা প্রয়োগ করে কিনা তা পরীক্ষা করুন


92

যদি কোনও শ্রেণি / ইন্টারফেস উত্তরাধিকার সূত্রে / প্রয়োগ করে তবে পরীক্ষার কোনও উপায় আছে কি?

private void MyGenericClass<T> ()
{
    if(T ... inherits or implements some class/interface
}

4
এটি কাজ করে বলে মনে হচ্ছে ... যদি (typof (টেস্টক্লাস) .IsAssignableFrom (টাইপফ (টি)), কেউ আমার সন্দেহকে নিশ্চিত করতে পারে? ধন্যবাদ!
ব্যবহারকারী 1229895

আমি সম্পূর্ণরূপে নিশ্চিত যে এই উত্তরটি বহুবার নকল হয়েছে!
ফেলিক্স কে।

4
ফেলিক্স কে এমনকি এই উত্তরটি বহুবার নকল করা হলেও, এটি অনেক সময় অনেক লোককে সহায়তা করে;) ... আমার মতো পাঁচ মিনিট আগে :)
শমূয়েল

উত্তর:


136

টাইপ নামক একটি পদ্ধতি রয়েছে I

Tউত্তরাধিকারী / প্রয়োগসমূহ কিনা তা পরীক্ষা করতে Employee:

typeof(Employee).IsAssignableFrom(typeof(T));

আপনি যদি .NET কোর লক্ষ্য করে থাকেন তবে পদ্ধতিটি টাইপআইএনফোতে চলে গেছে:

typeof(Employee).GetTypeInfo().IsAssignableFrom(typeof(T).Ge‌​tTypeInfo())

আপনার উত্তরটি উদাহরণ সহ উদাহরণস্বরূপ আপডেট করা উচিত, যেমন টাইপফ (টি) .আইএসএইসনেবলফ্রম (টাইফফ (আইএমআইআইন্টারফেস))
ডঃ অ্যান্ড্রু বারনেট-থম্পসন

নাইকি করা হয়নি; পুরানো উত্তর এখনও আছে। :) আমি কী দোষ করেছি তা জানার জন্য কয়েক সেকেন্ড নিয়েছিলাম। যাইহোক, +1 এ আবার। নেট ফ্রেমওয়ার্কের দুর্দান্ত বৈশিষ্ট্য।
স্যামুয়েল

আসলে, আপনি যেভাবে উল্লেখ করেছেন সেটি হ'ল কিছু সময় আগে আমার। আমি এই এক সংশোধন। পূর্ববর্তী মন্তব্য দেখুন। T inherits Uআসলে অনুবাদ typeof(T).IsAssignableFrom(typeof(U))
নাইকি

4
এটি প্রায় কাজ করার সময়, একটি সমস্যা রয়েছে যেখানে যদি Tঅন্য কোনও ধরণের সীমাবদ্ধ থাকে TOther, তবে মৃত্যুদন্ড কার্যকর করার পরে, typeof(T)আপনি প্রকৃতপক্ষে typeof(TOther)যে প্রকারটি Tউত্তীর্ণ হয়েছিল তা মূল্যায়ন করে না এবং সে ক্ষেত্রে typeof(SomeInterface).IsAssignableFrom(typeof(T))ব্যর্থ হবে (ধরে TOtherনিলে বাস্তবায়ন হয় না SomeInterface), যদিও আপনার কংক্রিটের ধরণটি কার্যকর করেছে SomeInterface
ডেভ কাজিনো

4
.Net কেন্দ্রের IsAssignableFromএর TypeInfoবর্গ শুধুমাত্র এটা একমাত্র আর্গুমেন্ট হিসাবে TypeInfo গ্রহণ তাই নমুনা নিম্নলিখিত হওয়া উচিত:typeof(Employee).GetTypeInfo().IsAssignableFrom(typeof(T).GetTypeInfo())
করতে কা


16

আপনি যদি সংকলনের সময় পরীক্ষা করতে চান: ত্রুটিটি যদি পছন্দসই ইন্টারফেস / শ্রেণি প্রয়োগ T না করে তবে আপনি নিম্নলিখিত সীমাবদ্ধতাটি ব্যবহার করতে পারেন

public void MyRestrictedMethod<T>() where T : MyInterface1, MyInterface2, MySuperClass
{
    //Code of my method here, clean without any check for type constraints.
}

আমি আশা করি এটি সাহায্য করবে.


12

সঠিক বাক্য গঠন

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 কেবল তখনই ফিরে আসে

  1. Tএবং Employeeএকই ধরণের প্রতিনিধিত্ব করে; বা,
  2. Employeeথেকে উত্তরাধিকারী T

এটি কিছু ক্ষেত্রে ব্যবহারের উদ্দেশ্যে হতে পারে তবে মূল প্রশ্নটির (এবং আরও সাধারণ ব্যবহারের) জন্য, কখন Tউত্তরাধিকারী হয় বা কিছু প্রয়োগ করে class/ তা প্রয়োগ করে interface:

typeof(Employee).IsAssignableFrom(typeof(T))

9

প্রত্যেকের সত্যিকারের অর্থ হ'ল:

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

2

আমি বিশ্বাস করি সিনট্যাক্সটি হ'ল: typeof(Employee).IsAssignableFrom(typeof(T));


এটি উদ্দেশ্যমূলক বাক্য গঠন। +1
লূক

0

যদিও অন্যরা বলেছে যে ইসএইসনেবলফ্রম হ'ল সর্বোত্তম উপায়, যদি আপনার কেবলমাত্র কোনও শ্রেণি অন্যের কাছ থেকে উত্তরাধিকার সূত্রে আসে কিনা তা পরীক্ষা করে দেখার দরকার হয় তবে কাজটিও typeof(T).BaseType == typeof(SomeClass)খুব কার্যকর।


এটি SomeClassসরাসরি থেকে প্রাপ্ত না হলে কাজ করে BaseClass
সানক্যাট 2000 2000

0

বিকল্প উপায়ে জানাতে একটি বস্তু যদি 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তবে @ নাইকির উত্তরটি ব্যবহার করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.