c# - কিভাবে একটি টাইপ সি#প্রতিফলন সঙ্গে একটি ইন্টারফেস প্রয়োগ করে তা নির্ধারণ করুন




reflection interface (8)

অন্য কেউ ইতিমধ্যে উল্লিখিত: বেঞ্জামিন এপ্রিল 10 '13 22:21 এ "

এটা নিশ্চিত করা সহজ ছিল না মনোযোগ দিতে এবং IsAssignable জন্য আর্গুমেন্ট পেতে পিছনে থেকে। আমি এখন GetInterfaces সঙ্গে যেতে হবে: পি -

আচ্ছা, চারপাশের আরেকটি উপায় কেবল ছোট্ট এক্সটেনশান পদ্ধতি তৈরি করতে যা কিছুটা "সর্বদাই স্বাভাবিক" চিন্তাভাবনা তৈরি করে (এবং সম্মত হ'ল এটি একটি স্বল্প ব্যক্তিগত ব্যক্তিগত পছন্দ যা এটি নিজের পছন্দগুলির উপর ভিত্তি করে সামান্য "আরও প্রাকৃতিক" ):

public static class TypeExtensions
{
    public static bool IsAssignableTo(this Type type, Type assignableType)
    {
        return assignableType.IsAssignableFrom(type);
    }
}

এবং কেন একটু বেশি জেনেরিক যাচ্ছে না (এটি সত্যিই আকর্ষণীয় কিনা তা নিশ্চিত না, ভাল আমি অনুমান করছি যে আমি কেবল 'সিনট্যাক্সিং' চিনির আরেকটি চিমটি পার করছি):

public static class TypeExtensions
{
    public static bool IsAssignableTo(this Type type, Type assignableType)
    {
        return assignableType.IsAssignableFrom(type);
    }

    public static bool IsAssignableTo<TAssignable>(this Type type)
    {
        return IsAssignableTo(type, typeof(TAssignable));
    }
}

আমি মনে করি এটি আরও বেশি স্বাভাবিক হতে পারে, কিন্তু আবারও খুব ব্যক্তিগত মতামতগুলির একটি বিষয়:

var isTrue = michelleType.IsAssignableTo<IMaBelle>();

C# মধ্যে প্রতিফলন কিছু নির্দিষ্ট সিস্টেম নির্ধারণ করা একটি উপায় প্রস্তাব করে। মডেল টাইপ কিছু ইন্টারফেস টাইপ?

public interface IMyInterface {}

public class MyType : IMyInterface {}

// should yield 'true'
typeof(MyType)./* ????? */MODELS_INTERFACE(IMyInterface);

আপনি আমার মাথা শীর্ষ বন্ধ কয়েক পছন্দ আছে

  1. typeof(IMyInterface).IsAssignableFrom(typeof(MyType))

  2. typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface))

একটি জেনেরিক ইন্টারফেসের জন্য, এটি একটি বিট ভিন্ন।

typeof(MyType).GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IMyInterface<>))

একটি সঠিক উত্তর হয়

typeof(MyType).GetInterface(nameof(IMyInterface)) != null;

যাহোক,

typeof(MyType).IsAssignableFrom(typeof(IMyInterface));

নিম্নোক্ত কোড স্ট্রিং এবং IConvertible দেখায় হিসাবে একটি ভুল ফলাফল ফিরে আসতে পারে:

    static void TestIConvertible()
    {
        string test = "test";
        Type stringType = typeof(string); // or test.GetType();

        bool isConvertibleDirect = test is IConvertible;
        bool isConvertibleTypeAssignable = stringType.IsAssignableFrom(typeof(IConvertible));
        bool isConvertibleHasInterface = stringType.GetInterface(nameof(IConvertible)) != null;

        Console.WriteLine($"isConvertibleDirect: {isConvertibleDirect}");
        Console.WriteLine($"isConvertibleTypeAssignable: {isConvertibleTypeAssignable}");
        Console.WriteLine($"isConvertibleHasInterface: {isConvertibleHasInterface}");
    }

ফলাফল:

 isConvertibleDirect: True
 isConvertibleTypeAssignable: False
 isConvertibleHasInterface: True

কি সম্পর্কে

if(MyType as IMyInterface != null)

?


সর্বোত্তম কর্মক্ষমতা জন্য জেফ এর উত্তর সংশোধন (পিয়ের আরানাড দ্বারা কর্মক্ষমতা পরীক্ষা ধন্যবাদ):

var type = typeof(MyType);
var implementsInterface = typeof(IMyInterface).IsAssignableFrom(type) && type.IsClass;

একটি প্রদত্ত Assembly একটি ইন্টারফেস বাস্তবায়নের যে সব ধরনের খুঁজে বের করতে:

var implementations = typeof(TypeInTargetAssembly).Assembly.GetTypes()
                          .Where(t => typeof(IMyInterface).IsAssignableFrom(t) && t.IsClass);

Type.IsAssignableFrom ব্যবহার করুন:

typeof(IMyInterface).IsAssignableFrom(typeof(MyType));

typeof(IMyInterface).IsAssignableFrom(someclass.GetType());

অথবা

typeof(IMyInterface).IsAssignableFrom(typeof(MyType));

    public static bool ImplementsInterface( this Type type, Type ifaceType ) {
        Type[] intf = type.GetInterfaces();
        for ( int i = 0; i < intf.Length; i++ ) {
            if ( intf[ i ] == ifaceType ) {
                return true;
            }
        }
        return false;
    }

আমি এই তিনটি কারণে, সঠিক রিলিজ মনে করি:

1) এটি GetInterfaces ব্যবহার করে এবং IsAssignable নয়, এটি IsAssignable এর থেকে দ্রুততর থেকে শেষ পর্যন্ত বেশ কয়েকটি চেকের পরে GetInterfaces কল করে।
2) এটি স্থানীয় অ্যারের উপর পুনরাবৃত্তি করে, তাই কোন সীমা চেক থাকবে না।
3) এটি == অপারেটর ব্যবহার করে যা টাইপের জন্য সংজ্ঞায়িত করা হয়, তাই সম্ভবত সমান পদ্ধতির চেয়ে নিরাপদ (যেটি কল থাকে, অবশেষে ব্যবহার করবে)।







interface