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


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.