সদৃশ অনুমোদিত বৈশিষ্ট্যগুলি কীভাবে তৈরি করবেন


96

আমি একটি বৈশিষ্ট্য শ্রেণি থেকে উত্তরাধিকারসূত্রে একটি কাস্টম বৈশিষ্ট্য ব্যবহার করছি। আমি এটি এর মতো ব্যবহার করছি:

[MyCustomAttribute("CONTROL")]
[MyCustomAttribute("ALT")]
[MyCustomAttribute("SHIFT")]
[MyCustomAttribute("D")]
public void setColor()
{

}

তবে "সদৃশ 'মাই কাস্টমঅ্যাট্রিবিউট' বৈশিষ্ট্য" ত্রুটি দেখানো হয়েছে।
আমি কীভাবে একটি সদৃশ অনুমোদিত বৈশিষ্ট্য তৈরি করতে পারি?

উত্তর:


185

একটি লাঠি AttributeUsageআপনার অ্যাট্রিবিউট শ্রেণী (হাঁ, যে একগাল এর) এবং সেট সম্মুখের দিকে অ্যাট্রিবিউট AllowMultipleকরতে true:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public sealed class MyCustomAttribute: Attribute

6
শুধু কৌতূহলী - কেন একটি "সিলড" শ্রেণি?
— টমাস আসচান

18
মাইক্রোসফট যখনই সম্ভব অ্যাট্রিবিউট শ্রেণীর sealing বিশেষ পরামর্শ দেওয়া হচ্ছে: msdn.microsoft.com/en-us/library/2ab31zeh.aspx
— আন্তন Gogolev

4
সিল কেন? সংক্ষেপে: বৈশিষ্ট্যযুক্ত অনুসন্ধানটি দ্রুত করে তোলে এবং এর অন্য কোনও প্রভাব নেই।
— নোয়েল ওয়াইডার

তা ছাড়া এটি আপনার কোডটিকে পুনরায় ব্যবহার করা থেকে অন্য কাউকে বাধা দেয়। ডেটাঅ্যানোটেশনগুলিতে বৈধতা বৈশিষ্ট্যগুলি সিল করা হয় না তা লক্ষণীয় , এটি অত্যন্ত কার্যকর কারণ এটি তাদের বিশেষত্ব তৈরি করা সম্ভব করে।
— নিউট্রিনো

@ নিউট্রিনো সিল করা ব্যবহার করা উচিত যখনই আপনি আশা করেন না বা আপনার ক্লাসগুলি উত্তরাধিকার সূত্রে ডিজাইন করবেন না। প্লাস, যখন উত্তরাধিকারগুলি বাগের উত্স হয়ে উঠতে পারে প্রাক্তন: থ্রেড-নিরাপদ বাস্তবায়ন।
— ফ্রান্সিসকো নেটো

20

AttributeUsageAttribute ;-p

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class MyAttribute : Attribute
{}

নোট করুন, তবে, আপনি যদি কম্পোনেন্টমোডেল ( TypeDescriptor) ব্যবহার করে থাকেন তবে এটি সদস্য হিসাবে কেবলমাত্র একটি বৈশিষ্ট্য উদাহরণ (প্রতিটি বৈশিষ্ট্যের ধরণ) সমর্থন করে; কাঁচা প্রতিবিম্ব যে কোনও সংখ্যা সমর্থন করে ...


13

অ্যান্টনের সমাধানটি সঠিক, তবে আরও একটি গ্যাচা রয়েছে ।

সংক্ষেপে, যদি না আপনার কাস্টম অ্যাট্রিবিউট টাইপআইডিকে ওভাররাইড করে, তবে এর মাধ্যমে অ্যাক্সেস করা PropertyDescriptor.GetCustomAttributes()কেবলমাত্র আপনার অ্যাট্রিবিউটের একক উদাহরণ ফিরে আসবে।


তবে এটি এর মাধ্যমে কাজ করে: var কাস্টম্যাট্যাট = সম্পত্তিInfo.GetCustomAttributes <মাই কাস্টমআট্রিবিউট> ();
— oo_dev 24'18

9

ডিফল্টরূপে Attributeকেবলমাত্র একবারে একক ক্ষেত্র / সম্পত্তি / ইত্যাদিতে সীমাবদ্ধ। আপনি এমএসডিএন-তে ক্লাসের সংজ্ঞাAttribute থেকে এটি দেখতে পারেন :

[AttributeUsageAttribute(..., AllowMultiple = false)]
public abstract class Attribute : _Attribute

অতএব, অন্যরা যেমন উল্লেখ করেছে, সমস্ত উপশ্রেণী একই পদ্ধতিতে সীমাবদ্ধ এবং আপনার যদি একই বৈশিষ্ট্যের একাধিক উদাহরণের প্রয়োজন হয় তবে আপনার স্পষ্টভাবে সেট AllowMultipleকরতে হবে true:

[AttributeUsage(..., AllowMultiple = true)]
public class MyCustomAttribute : Attribute

একাধিক ব্যবহারের অনুমতি দেয় এমন বৈশিষ্ট্যগুলিতে, প্রত্যাশার মতো কাজের মতো বৈশিষ্ট্যগুলি নিশ্চিত করতে আপনার TypeIdসম্পত্তিটি ওভাররাইড করা উচিতPropertyDescriptor.Attributes । এটি করার সহজতম উপায় হ'ল বৈশিষ্ট্যটিকে নিজের করে দেওয়ার জন্য সেই সম্পত্তিটি বাস্তবায়ন করা:

[AttributeUsage(..., AllowMultiple = true)]
public class MyCustomAttribute : Attribute
{
    public override object TypeId
    {
        get
        {
            return this;
        }
    }
}

(এই উত্তরটি পোস্ট করা অন্যটি ভুল হওয়ার কারণে নয়, কারণ এটি আরও বিস্তৃত / প্রচলিত উত্তর)


3

বিকল্প হিসাবে, অনুক্রমের অনুমতি দেওয়ার জন্য আপনার বৈশিষ্ট্যটিকে নতুন করে ডিজাইন করার বিষয়ে ভাবুন about

[MyCustomAttribute(Sequence="CONTROL,ALT,SHIFT,D")]

বা

[MyCustomAttribute("CONTROL-ALT-SHIFT-D")]

তারপরে আপনার বৈশিষ্ট্যটি কনফিগার করতে মানগুলিকে পার্স করুন।

এর উদাহরণের জন্য www.codeplex.com/aspnet এএসপি.নেট এমভিসি সোর্স কোডে অথরিজঅ্যাট্রিবিউটটি দেখুন ।


4
এমনকি MyCustomAttributeকন্সট্রাক্টর একটি সংশোধক সহ বা তার ছাড়াই একটি স্ট্রিংয়ের অ্যারে নিতে সক্ষম possible তারপরে এটি সিনট্যাক্সের সাথে প্রয়োগ করা যেতে পারে (সহ )। string[]params[MyCustom("CONTROL", "ALT", "SHIFT", "D")]params
— জেপ্প স্টিগ নীলসেন

2

আপনি অ্যাট্রিবিউট ইউজ যোগ করার পরে, আপনি এই বৈশিষ্ট্যটি আপনার অ্যাট্রিবিউট শ্রেণিতে যুক্ত করেছেন তা নিশ্চিত করুন

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