কোনও বস্তুর নির্দিষ্ট পদ্ধতি / সম্পত্তি আছে কিনা তা কীভাবে পরীক্ষা করবেন?


155

সম্ভবত গতিশীল প্যাটার্ন ব্যবহার করছেন? আপনি ডায়নামিক কীওয়ার্ড ব্যবহার করে কোনও পদ্ধতি / সম্পত্তি কল করতে পারেন, তাই না? উদাহরণস্বরূপ, myDynamicObject.DoStuff () কল করার আগে পদ্ধতিটি বিদ্যমান কিনা তা কীভাবে পরীক্ষা করবেন?


মাই ডায়নামিকঅবজেক্টের প্রকারটি কী ? এটি কি ক্লাস থেকে প্রাপ্ত DynamicObject?
চেং চেন

গতিশীল কীওয়ার্ড সহ কিছু ঘোষিত হয়েছে
লুই রাইস

উত্তর:


224

আপনি এরকম কিছু লিখতে পারেন:

public static bool HasMethod(this object objectToCheck, string methodName)
{
    var type = objectToCheck.GetType();
    return type.GetMethod(methodName) != null;
} 

সম্পাদনা করুন: আপনি এমনকি কোনও এক্সটেনশন পদ্ধতিও করতে পারেন এবং এটি এটি ব্যবহার করতে পারেন

myObject.HasMethod("SomeMethod");

গেটটাইপ () রানটাইমের ধরণটি ফেরত দেবে? (অর্থাত্ আপত্তি নেই?)
লুই রাইস

2
হ্যাঁ, গেটটাইপ () চলমান প্রকারটি ফেরত দেয় যেখানে টাইপফ () বস্তুটি ফেরত দেয়।
জুলিয়ান

1
ডক্স অনুসারে গেটটাইপ () "বর্তমান উদাহরণের সঠিক রানটাইম ধরণ" প্রত্যাবর্তন করবে।
tzup

এছাড়াও, এক্সটেনশন পদ্ধতিটি স্থির হওয়া দরকার।
ফ্রেজার

9
আমি লিখতে পছন্দ করি: অবজেক্টটোকেক.গেটটাইপ ()। গেটমেথড (মেথডনেম)! = নাল
এফির্যাট

85

প্রতিচ্ছবি মাধ্যমে

 var property = object.GetType().GetProperty("YourProperty")
 property.SetValue(object,some_value,null);

অনুরূপ পদ্ধতি জন্য


খুশী হলাম। আপনি যথাযথ সংজ্ঞায়িত সম্পত্তি পেতে লুপে গেটমেথডও করতে পারেন।
Jnr

ইউআই নিয়ন্ত্রণ এবং তাদের পিতামাতার লিঙ্কযুক্ত তালিকার মাধ্যমে লুপিংয়ের জন্য দরকারী
চিকোভিটজ

ইন GetType()মত পদ্ধতি আছে GetProperties()। এটি অ্যারে ফিরে আসছে PropertyInfo। তবে আমি কীভাবে GetProperties()পদ্ধতিটি ব্যবহার করতে পারি ?
যোগেশ প্যাটেল

43

এটি একটি পুরানো প্রশ্ন, কিন্তু আমি কেবল এটির মধ্যে দৌড়েছি। Type.GetMethod(string name)যদি সেই নামের সাথে একাধিক পদ্ধতি থাকে তবে একটি অ্যাম্পিগিউজম্যাচএক্সেপশন নিক্ষেপ করবে, সুতরাং আমরা সেই কেসটিকে আরও ভালভাবে পরিচালনা করব

public static bool HasMethod(this object objectToCheck, string methodName)
{
    try
    {
        var type = objectToCheck.GetType();
        return type.GetMethod(methodName) != null;
    }
    catch(AmbiguousMatchException)
    {
        // ambiguous means there is more than one result,
        // which means: a method with that name does exist
        return true;
    }
} 

18

এটির জন্য কোনও গতিশীল ধরণের ব্যবহার না করা ভাল এবং আপনার শ্রেণিটি একটি ইন্টারফেস প্রয়োগ করতে দেয়। তারপরে, আপনি রানটাইমে অন্য কোনও উপায়ে যে ইন্টারফেসটি প্রয়োগ করে তা পরীক্ষা করতে পারেন এবং এইভাবে, প্রত্যাশিত পদ্ধতি (বা সম্পত্তি) রয়েছে।

public interface IMyInterface
{
   void Somemethod();
}


IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
   x.Somemethod();
}

আমি মনে করি এটিই একমাত্র সঠিক উপায়।

আপনি যে জিনিসটির কথা উল্লেখ করছেন সেটি হ'ল হাঁস-টাইপিং, যা এমন পরিস্থিতিতে তৈরিতে কার্যকর যেখানে আপনি ইতিমধ্যে জানেন যে বস্তুর পদ্ধতি রয়েছে তবে সংকলকটি এটি পরীক্ষা করতে পারে না। উদাহরণস্বরূপ এটি সিওএম আন্তঃবিদ্যুত পরিস্থিতিতে কার্যকর useful ( এই নিবন্ধটি পরীক্ষা করুন )

আপনি যদি উদাহরণস্বরূপ প্রতিবিম্বের সাথে হাঁস-টাইপিংয়ের মিশ্রণ করতে চান তবে আমি মনে করি আপনি হাঁস-টাইপিংয়ের লক্ষ্যটি হারিয়েছেন।


2
কী যদি অবজেক্টটি .NET ফ্রেমওয়ার্ক দ্বারা সরবরাহ করা কোনও বস্তু হতে পারে এবং আমি কোনও কিছু বাস্তবায়নের জন্য এটি ঘোষণা করতে পারি না?
লুই রাইস

সমস্যা কি ? । 'নেট' ফ্রেমওয়ার্কের ঠিক একইভাবে সরবরাহ করা 'অবজেক্ট' এমন একটি বস্তু কিনা তা আপনি পরীক্ষা করতে পারেন
ফ্রেডেরিক গিয়সেল

উদাহরণস্বরূপ, আপনি কোনও বস্তুর "অ্যাড" পদ্ধতি আছে কিনা তা পরীক্ষা করতে চান। এ্যানড অবজেক্টটি একটি তালিকা <তালিকা> বা অন্য কোনও শ্রেণি হতে পারে যা অনুমেয় নয়
লুই রাইস

3
সম্ভবত আপনার সিওএম দিয়ে কোনও অ্যাডোব পণ্য স্ক্রিপ্ট করার দিকে নজর দেওয়া উচিত। একই ফাংশন কল সম্পূর্ণ ভিন্ন COM অবজেক্টগুলি ফিরিয়ে দিতে পারে এবং (অ্যাডোব) ডিজাইন অনুসারে তাদের একমাত্র সাধারণ পূর্বপুরুষ অবজেক্ট। এছাড়াও: এটি কোনও আধুনিক গতিশীল স্ক্রিপ্টিং ভাষার (পাইথন, জাভাস্ক্রিপ্ট, ভিবি স্ক্রিপ্ট, পিএইচপি, লুয়া ... আমি যেতে পারতাম) এটি সাধারণ একটি প্যাটার্ন। এটি কোনও বাগ নয়, এটি একটি বৈশিষ্ট্য।
টিম কেটিং

5
এটি গন্ধ তবে এটি মাইক্রোসফ্ট তৈরি করেছে। ওয়েবকন্ট্রোলগুলি দেখুন যেমন বাটন, লিংকবটন ইত্যাদি They এগুলি উভয়ই অনক্লিয়েন্টক্লিক সম্পত্তি প্রয়োগ করে তবে বলুন, তালিকা কন্ট্রোল এবং প্যানেল তা করে না। অনক্লিয়েন্টক্লিক একটি ইন্টারফেসে সংজ্ঞায়িত করা হয় নি তাই প্রতিফলন একমাত্র বিকল্প।
হামারআইপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.