সি # তে প্যারামিটার হিসাবে কেবল এক প্রকারের পাশ করা


130

হাইপোটিকিকভাবে এটি করা আমার পক্ষে সহজ হবে:

foo.GetColumnValues(dm.mainColumn, int)
foo.GetColumnValues(dm.mainColumn, string)

যেখানে পাস করা প্রকারের উপর নির্ভর করে গেটকলમ્સ পদ্ধতিটি ভিতরে একটি আলাদা পদ্ধতি কল করবে।

হ্যাঁ, আমি এটি বুলিয়ান পতাকা বা অনুরূপ হিসাবে করতে পারলাম, আমি কেবল ভাবছিলাম যে সম্ভবত এটি পাস করার কোনও উপায় আছে কিনা, এবং জিজ্ঞাসা করুন:

টাইপফ (আর্গ [1]) বা অনুরূপ ...

আমি পদ্ধতিটি ওভাররাইড করতে পারি, জেনেরিকগুলি ব্যবহার করতে পারি ইত্যাদি I আমি জানি এটি করার বিভিন্ন উপায় রয়েছে, এটি সম্ভব হলে আমি কেবল কৌতূহলী ছিলাম।


আমার ভাবনাটি হুবহু, foo আসলে কী তার উপর নির্ভর করে। foo.GetColumnValues<int>(dm.mainColumn)যেতে উপায় হতে পারে।
মেজর প্রোডাকশনস

1
যেমনটি আমি বলেছি, আমি বুঝতে পারি যে এটি করার অন্যান্য উপায় রয়েছে (বুলিয়ান পতাকা, জেনেরিক্স, পদ্ধতিটিকে ওভাররাইড করে) আমি কেবল ভাবছিলাম যে এটি প্যারামিটার হিসাবে সম্ভব কিনা।
মায়ো

@ মারকমায়ো: আমি যদি প্রশ্নটি বুঝতে পারি না যে আপনি " যদি আপনি জানেন যে আপনি পদ্ধতিটি ওভাররাইড করতে পারেন, জেনেরিকগুলি ব্যবহার করতে পারেন ইত্যাদি এবং আপনি জানেন যে এটি করার বিভিন্ন উপায় রয়েছে তবে এটি সম্ভব হলে আপনি কেবল কৌতূহলী ছিলেন" । তাই আপনি এই সব জানেন কিন্তু সম্ভব যদি আপনি কৌতূহলী ??
টিম শেমলেটার

@ টিমশ্মেলটার - আমি বর্ণিত ফর্মটিতে। অর্থাত্ এটি দ্বিতীয় প্যারামিটার হিসাবে পাস করা। দেখা যাচ্ছে, রিড কিন্ডা বলেছিল যে আমি পরে কী ছিল - আপনি কোথায় ব্যবহার করেন (..., টাইপ টাইপ)। এটাই আমি খুঁজছিলাম।
মেয়ো

1
ভাল প্রশ্ন, উত্সাহিত, আমি এমএস দেখতে পাচ্ছি VB.NET যেমন অন্তর্নির্মিত অপারেটরগুলির জন্য প্যারামিটার হিসাবে টাইপ ব্যবহার করে উদাহরণস্বরূপ ট্রাইস্টকাস্ট, এবং প্রায়শই আমি ইচ্ছা করেছি যে আমি নিজে সি # / ভিবিতে এটি করতে পারি - আপনার বর্ণনার ফ্যাশনে।
চক্কি

উত্তর:


213

দুটি সাধারণ পন্থা আছে। প্রথম, আপনি পাস করতে পারেনSystem.Type

object GetColumnValue(string columnName, Type type)
{
    // Here, you can check specific types, as needed:

    if (type == typeof(int)) { // ...

এটিকে বলা হবে: int val = (int)GetColumnValue(columnName, typeof(int));

অন্য বিকল্পটি জেনেরিকগুলি ব্যবহার করা হবে:

T GetColumnValue<T>(string columnName)
{
    // If you need the type, you can use typeof(T)...

বক্সিংটি এড়ানো এবং কিছু ধরণের সুরক্ষা সরবরাহ করার সুবিধা রয়েছে এবং এটিকে বলা হবে: int val = GetColumnValue<int>(columnName);


1
আপনি একটি এক্সটেনশন পদ্ধতিও করতে পারেন, পাবলিক স্ট্যাটিক টি গেটক্লমভ্যালু <টি> (এই স্ট্রিং কলামনাম) {...} তারপরে আপনি foo.Get ColumnValues ​​<স্ট্রিং> (dm.mainColumn) বলতে পারেন
জোশুয়া জি

তবে আপনি এমন একটি পদ্ধতি কীভাবে সংজ্ঞায়িত করবেন যার কয়েকটি যুক্তি রয়েছে এবং এর মধ্যে একটি জেনেরিক হওয়া উচিত? যেহেতু জেনেরিকটি পদ্ধতি আর্গুমেন্ট তালিকার আগে সংজ্ঞায়িত করা হয়েছে, আপনি কীভাবে জানবেন যে কোনটি জেনেরিক হওয়া উচিত?
ব্যাডমিন্টনকিট

5
@ ব্যাডমিন্টনগ্যাট T Foo<T,U>(string arg1, U arg2)বা অনুরূপ
রিড

প্রথম পন্থাটি ব্যবহার করার সময়, টাইপ করার জন্য কোনও ডিফল্ট মান নির্ধারণ করার কোনও উপায় আছে কি? (যেমন ভালো কিছু object GetColumnValue(string columnName, Type type = object)? যে বেশ আমার জন্য কাজ বলে মনে হচ্ছে না কিন্তু এটা জানা দরকারী হবে।
ডেভ কোল

22

foo.GetColumnValues(dm.mainColumn, typeof(string))

বিকল্পভাবে, আপনি একটি জেনেরিক পদ্ধতি ব্যবহার করতে পারেন:

public void GetColumnValues<T>(object mainColumn)
{
    GetColumnValues(mainColumn, typeof(T));
}

এবং আপনি এটির মতো ব্যবহার করতে পারেন:

foo.GetColumnValues<string>(dm.mainColumn);

13

আপনি একটি প্রকারটি আর্গুমেন্ট হিসাবে পাস করতে পারেন তবে এটি করতে আপনাকে অবশ্যই ব্যবহার করতে হবে typeof:

foo.GetColumnValues(dm.mainColumn, typeof(int))

পদ্ধতিটির সাথে টাইপ সহ একটি পরামিতি গ্রহণ করা দরকার Type


যেখানে পাস করা প্রকারের উপর নির্ভর করে গেটকলમ્સ পদ্ধতিটি ভিতরে একটি আলাদা পদ্ধতি কল করবে।

আপনি যদি এই আচরণটি চান তবে আপনার এই ধরণেরটি আর্গুমেন্ট হিসাবে পাস করা উচিত নয় তবে পরিবর্তে একটি টাইপ প্যারামিটার ব্যবহার করা উচিত।

foo.GetColumnValues<int>(dm.mainColumn)

8
foo.GetColumnValues(dm.mainColumn, typeof(int));
foo.GetColumnValues(dm.mainColumn, typeof(string));

বা জেনেরিক ব্যবহার:

foo.GetColumnValues<int>(dm.mainColumn);
foo.GetColumnValues<string>(dm.mainColumn);

3
আমি আপনাকে ডিভি করিনি, তবে সম্ভবত এটি কারণ আপনি দেখিয়েছিলেন যে এটি কীভাবে ডাকা হবে এবং ফাংশন সংজ্ঞাটি নির্দিষ্ট করে নি
জে কনস্ট্যান্টাইন

3
লোকেরা যখন চামচ খাওয়ানোর দরকার হয় তখন আমি এটিকে ঘৃণা করি। উত্তর + এমএসডিএন সম্পর্কে একটি সংক্ষিপ্ত পঠন যথেষ্ট। আমি সন্দেহ করি যে ডাউন-ভোটাররা প্রতিবেদনের প্রতিদ্বন্দ্বী - কত ক্ষুদ্র।
ড্যানি ভারোদ


0

আপনি টাইপ টাইপের একটি যুক্তি ব্যবহার করতে পারেন - আইও, পাস টাইপ অফ (ইনট)। আপনি (সম্ভবত আরও দক্ষ) পদ্ধতির জন্য জেনেরিকগুলিও ব্যবহার করতে পারেন।


0

জেনেরিক ধরনের ব্যবহার করুন!

  class DataExtraction<T>
{
    DateRangeReport dateRange;
    List<Predicate> predicates;
    List<string> cids;

    public DataExtraction( DateRangeReport dateRange,
                           List<Predicate> predicates,
                           List<string> cids)            

    {
        this.dateRange = dateRange;
        this.predicates = predicates;
        this.cids = cids;
    }
}

এবং এটিকে কল করুন:

  DataExtraction<AdPerformanceRow> extractor = new DataExtraction<AdPerformanceRow>(dates, predicates , cids);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.