যদি বস্তু ইন্টারফেস প্রয়োগ করে তবে পরীক্ষা করুন


355

যদি কোনও বস্তু সি # তে প্রদত্ত ইন্টারফেস প্রয়োগ করে তবে পরীক্ষার সহজ উপায় কী? ( জাভাতে এই প্রশ্নের উত্তর )

উত্তর:


569
if (object is IBlah)

অথবা

IBlah myTest = originalObject as IBlah

if (myTest != null)

85
+1 দ্বিতীয়টি আরও ভাল কারণ আপনার সম্ভবত প্রথমটি দিয়ে প্রথমে প্রথমে দুটি কাস্ট দেওয়া ("হয়" এবং তারপরে একটি স্পষ্ট কাস্ট) দেওয়ার দরকার পরে শেষ হবে। দ্বিতীয় পদ্ধতির সাথে আপনি কেবল একবার কাস্ট করেছেন।
অ্যান্ড্রু হরে

51
@ অ্যান্ড্রু: +1; জুলিয়ান এম বাক্নাল দ্বারা ক্লাসিক ডাবল-কাস্টিং অ্যান্টিপ্যাটার্ন ব্লগ পোস্টের লিঙ্কটির জন্য আবারও সময় ।
জেরোয়েন ওয়েয়ার্ট প্লাইমার্স 12 '

1
অপ্টিমাইজেশন সম্ভবত আপনি প্রথম ক্ষেত্রে দুইবার নিক্ষেপ করবেন না?
বুজজ

1
@ জোড়েন, এই লিঙ্কটি একটি পয়েন্ট মিস করে যদি আপনি এমন কাঠামোর সাথে কাজ করছেন যা আপনি "হিসাবে" ব্যবহার করতে পারবেন না কারণ এটি একটি নাল ধরে রাখবে না যা "হিসাবে" ফিরে আসার চেষ্টা করে, সেক্ষেত্রে আপনাকে অবিচ্ছিন্নভাবে যেতে হবে ক্লাসটি
ইন্টের

46
যেহেতু সি # 6.0:if (object is IBlah iblah) { iblah.SomeMethod(); }
ক্ল্যানিস

224

সংকলনের সময় যদি আপনি ইন্টারফেস টাইপটি জানেন এবং আপনি যে ধরণের পরীক্ষা করছেন তার isউদাহরণ রয়েছে তবে asঅপারেটরগুলি ব্যবহার করা সঠিক উপায়। এমন কিছু যা অন্য কেউ উল্লেখ করেছে বলে মনে হয় না Type.IsAssignableFrom:

if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}

আমি মনে করি এটি ফিরে আসা অ্যারের মধ্য দিয়ে দেখার চেয়ে অনেক বেশি সুন্দর GetInterfacesএবং ক্লাসগুলির জন্যও কাজ করার সুবিধা রয়েছে।


আমি নির্ধারণ করার চেষ্টা করছি যে কোনও টাইপ আইলিস্টের কিছু ইনস্ট্যান্টেশন প্রয়োগ করে। আমি "টাইপফ (আইলিস্ট <>) ব্যবহার করছি Is আইএসএইসনেবলফ্রোম (কিছু টাইপ)" তবে এটি কাজ করছে না।
KeyboardDrummer

3
আপনি অন্য একটি প্রশ্ন জিজ্ঞাসা করা ভাল হতে পারে। যদি কিছু টাইপ তালিকার তালিকার ধরণ হয় তবে আপনার টাইপফের প্রয়োজন হতে পারে (আইলিস্ট <>) Make মেকজেনেরিক টাইপ (কিছু টাইপ)। যদি সামান্য টাইপ হয় তবে তালিকার ধরণটি আপনার টাইপ.গেটজেনেরিকআরগমেন্টস এবং টাইপ.গেটজেনেরিক টাইপপরিচয়টি দেখতে হবে।
অ্যান্ড্রু কেন্নান

আমি এটি একটি প্লাগইন সিস্টেমে টাইপ চেকিংয়ের জন্য ব্যবহার করি। এটি এমন পরিস্থিতিতে ব্যবহার করা যেতে পারে যেখানে অবজেক্টের কোনও উদাহরণ উপস্থিত নেই। তবে আমি এই স্টাইল এবং রবার্ট উভয়ই ব্যবহার করি আমি যা করছি তার উপর নির্ভর করে আমি উভয় উপায়ে ভোট দিয়েছি।
জেমস

এটি একটি পুরোনো মন্তব্য, কিন্তু উত্তর @ Steenreem প্রশ্ন, ব্যবহার করা typeof(IList).IsAssignableFrom(someType)ছাড়াই <>
সালুস

এই পদ্ধতিটি রূপান্তর অপারেটরগুলির সাথেও কাজ করে এবং যদি টাইপ কনভার্টার্স জড়িত থাকে
হ্যারাল্ড কোপপুলস

22

উদাহরণস্বরূপ:

if (obj is IMyInterface) {}

শ্রেণীর জন্য:

typeof(MyClass).GetInterfaces()ইন্টারফেস রয়েছে কিনা তা পরীক্ষা করুন ।


1
যদি (অ্যারে.ইনডেক্সঅফ (টাইপফ (মাইক্লাস)। গেটইন্টারফেসগুলি (), টাইপফ (আইএমআইএনটারফেস))! = -1) {...}
কনস্টান্টিন

2
বা: যদি (typof (MyClass) .GetInterfaces ()। এতে রয়েছে (typof (IMyInterface)) {...}
ল্যান্স ফিশার

17

আপনি যদি চেকের পরে টাইপকাস্ট করা অবজেক্টটি ব্যবহার করতে চান:
যেহেতু সি # 7.0:

if (obj is IMyInterface myObj)

এই হিসাবে একই

IMyInterface myObj = obj as IMyInterface;
if (myObj != null)

নেট ডক্স দেখুন: # টাইপ প্যাটার্নের সাথে প্যাটার্নের মিলis


16

@ অ্যান্ড্রুকেন্নানের উত্তরের একটি পরিবর্তন আমি রানটাইমের সময় প্রাপ্ত ধরণের জন্য সম্প্রতি ব্যবহার করে শেষ করেছি:

if (serviceType.IsInstanceOfType(service))
{
    // 'service' does implement the 'serviceType' type
}

7

এই পোস্টটি একটি ভাল উত্তর।

public interface IMyInterface {}

public class MyType : IMyInterface {}

এটি একটি সাধারণ নমুনা:

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

অথবা

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

3

"হ'ল" অপারেটরটি ব্যবহার করে পরীক্ষার পাশাপাশি, আপনার ভেরিয়েবলগুলি কোনও নির্দিষ্ট ইন্টারফেস প্রয়োগ করে তা নিশ্চিত করার জন্য আপনি আপনার পদ্ধতিগুলি সাজাতে পারেন:

public static void BubbleSort<T>(ref IList<T> unsorted_list) where T : IComparable
{
     //Some bubbly sorting
}

আমি নিশ্চিত নই যে এটির কোন সংস্করণটি কার্যকর হয়েছিল তাই এটি আপনার সংস্করণে কাজ না করে।


2
.NET 2.0 যুক্ত জেনেরিকগুলি।
রবার্ট সি বার্থ

এই থ্রেডে এটিই কেবল সংকলন-সময় চেক, ধন্যবাদ।
ডাস্টিন ম্যালোন

2

আমার জন্য যা কাজ করেছে তা হ'ল:

Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));


1

সম্প্রতি আমি অ্যান্ড্রু কেন্নানের উত্তরটি ব্যবহার করার চেষ্টা করেছি এবং এটি কোনও কারণে আমার পক্ষে কার্যকর হয়নি। আমি পরিবর্তে এটি ব্যবহার করেছি এবং এটি কাজ করেছে (দ্রষ্টব্য: নাম স্থান লেখার প্রয়োজন হতে পারে)।

if (typeof(someObject).GetInterface("MyNamespace.IMyInterface") != null)

2
যদি আপনি এই পথে যেতে না চান তবে আমি যাদু স্ট্রিংয়ের অনুরাগী নই, তাই আমি সর্বনিম্ন এটিকে টাইপফোন (আইএমআইআইন্টারফেস) হিসাবে পরিবর্তন করতে পারি N এটি বোনাস হিসাবে নাম রিফ্যাক্টরিং প্রমাণ করতে সাহায্য করে।
greyalien007

0

আমি ব্যবহার করতাম

Assert.IsTrue(myObject is ImyInterface);

আমার ইউনিট পরীক্ষায় একটি পরীক্ষার জন্য যা পরীক্ষা করে যে মায়োবজেক্ট এমন একটি বস্তু যা আমার ইন্টারফেস ImyInterface প্রয়োগ করেছে।


-1

আমার একটি পরিস্থিতি ছিল যেখানে আমি কোনও পদ্ধতির সাথে ভেরিয়েবল পাস করছিলাম এবং নিশ্চিত ছিলাম না এটি ইন্টারফেস বা কোনও বস্তু হতে চলেছে কিনা।

লক্ষ্যগুলি ছিল:

  1. আইটেমটি যদি একটি ইন্টারফেস হয় তবে ইন্টারফেসটির সাথে কনস্ট্রাক্টর কলটিতে একটি প্যারামিটার হয়ে সেই ইন্টারফেসের ভিত্তিতে কোনও বস্তু ইনস্ট্যান্ট করুন।
  2. আইটেমটি যদি কোনও অবজেক্ট হয় তবে আমার কলগুলির জন্য কনডাক্টর একটি ইন্টারফেসের প্রত্যাশা করছেন এবং আমি কোডটি ট্যাঙ্ক করতে চাইনি বলে একটি শূন্য ফেরান।

আমি নিম্নলিখিতটি দিয়ে এটি অর্জন করেছি:

    if(!typeof(T).IsClass)
    {
       // If your constructor needs arguments...
       object[] args = new object[] { my_constructor_param };
       return (T)Activator.CreateInstance(typeof(T), args, null);
    }
    else
       return default(T);

-12

এই কাজ করা উচিত :

MyInstace.GetType().GetInterfaces();

তবে খুব সুন্দর:

if (obj is IMyInterface)

বা এমনকি (খুব মার্জিত নয়):

if (obj.GetType() == typeof(IMyInterface))

9
টাইপফের জন্য সাম্যতার জন্য চেক করা (আইএমআইআইন্টারফেস) সর্বদা ব্যর্থ হবে। Downvoted।
জে বাজুজি

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