কীভাবে সি # তে একটি কাস্টম বৈশিষ্ট্য তৈরি করবেন


119

আমি প্রচুর বার চেষ্টা করেছি কিন্তু তবুও আমি কাস্টম বৈশিষ্ট্যগুলির ব্যবহার বুঝতে সক্ষম নই (আমি ইতিমধ্যে প্রচুর লিঙ্ক দিয়ে গিয়েছি)।

কেউ দয়া করে আমাকে কোড সহ একটি কাস্টম অ্যাট্রিবিউটের খুব মৌলিক উদাহরণটি ব্যাখ্যা করতে পারেন?

উত্তর:


96

একটি কাস্টম অ্যাট্রিবিউট তৈরি করার কোডটি মোটামুটি সহজ হলেও এট্রিবিউটগুলি কী কী তা আপনার বোঝা খুব গুরুত্বপূর্ণ:

বৈশিষ্ট্যগুলি আপনার প্রোগ্রামে সংকলিত মেটাডাটা। বৈশিষ্ট্যগুলি এগুলি কোনও শ্রেণি, সম্পত্তি বা মডিউলে কোনও কার্যকারিতা যুক্ত করে না - কেবল ডেটা। যাইহোক, প্রতিবিম্ব ব্যবহার করে, কার্যকারিতা তৈরির জন্য কেউ এই বৈশিষ্ট্যগুলি লাভ করতে পারে।

সুতরাং, উদাহরণস্বরূপ, চলুন মাইক্রোসফ্টের এন্টারপ্রাইজ লাইব্রেরি থেকে বৈধকরণ অ্যাপ্লিকেশন ব্লকটি দেখুন । আপনি যদি একটি কোড উদাহরণটি দেখেন তবে আপনি দেখতে পাবেন:

    /// <summary>
    /// blah blah code.
    /// </summary>
    [DataMember]
    [StringLengthValidator(8, RangeBoundaryType.Inclusive, 8, RangeBoundaryType.Inclusive, MessageTemplate = "\"{1}\" must always have \"{4}\" characters.")]
    public string Code { get; set; }

উপরের স্নিপেট থেকে, কেউ অনুমান করতে পারে যে কোডটি সর্বদা বৈধ হয়ে যাবে, যখনই পরিবর্তিত হবে, যা যাচাইকারীর নিয়ম অনুসারে (উদাহরণস্বরূপ, কমপক্ষে 8 টি অক্ষর এবং সর্বাধিক 8 টি অক্ষর রয়েছে)। তবে সত্যটি অ্যাট্রিবিউট কিছুই করে না; পূর্বে উল্লিখিত হিসাবে, এটি কেবল সম্পত্তিটিতে মেটাডেটা যুক্ত করে।

তবে এন্টারপ্রাইজ লাইব্রেরিতে রয়েছে একটি Validation.Validate পদ্ধতি রয়েছে যা আপনার অবজেক্টটি সন্ধান করবে এবং প্রতিটি সম্পত্তির জন্য, বিষয়বস্তুগুলি অ্যাট্রিবিউট দ্বারা জানানো নিয়ম লঙ্ঘন করেছে কিনা তা এটি পরীক্ষা করবে।

সুতরাং, আপনাকে বৈশিষ্ট্যগুলি সম্পর্কে এইভাবে ভাবতে হবে - আপনার কোডে ডেটা যুক্ত করার একটি উপায় যা পরে অন্যান্য পদ্ধতি / শ্রেণি / ইত্যাদি দ্বারা ব্যবহৃত হতে পারে।


আমি কী উত্তরটি এবং বিশেষত পছন্দ করতে পারি ", আমি আরও একটি প্রশ্ন উপরের কোডের সেট স্টেটমেন্টে একই শর্ত রাখতে পারি যাতে বৈশিষ্ট্যগুলি থেকে এটি কীভাবে আলাদা,
স্ল্যাশ শোগডে

1
@ স্ল্যাশ: আপনি কি তা পুনরায় ব্যাখ্যা করতে পারবেন? আমি প্রশ্নটি বেশ বুঝতে পারিনি।
ব্রুনো ব্রেন্ট

1
আমি মনে করি স্ল্যাশ বলতে গুণাবলীর ব্যবহার এবং সম্পত্তি সেটারের ভিতরে প্রকৃত বৈধতা কোড স্থাপনের মধ্যে পার্থক্য সম্পর্কে জিজ্ঞাসা করা to উত্তর: সেটার অভ্যন্তরে কোড লেখার সময় মানটি যাচাই করার জন্য করা যেতে পারে, কেবলমাত্র অ্যাট্রিবিউটগুলি ব্যবহার করে যেমন বৈধতা কার্যকর করা যায় না। বৈশিষ্ট্যগুলি কেবলমাত্র "মেটা-ডেটা"। অন্য কোথাও অন্য কোডে আপনার ব্যবহার করা গুণাবলী, সেগুলি পড়তে এবং সেগুলির ভিত্তিতে ক্রিয়া সম্পাদন করতে আগ্রহী হওয়া উচিত। ব্রুনো ব্র্যান্ট উল্লিখিত হিসাবে একটি সাধারণ উদাহরণ একটি বৈধতা গ্রন্থাগার।
রোমার

10
কেন এটি গ্রহণযোগ্য উত্তর তা নিশ্চিত নয়। আসল প্রশ্ন (যা গুগলে সূচিযুক্ত হয়) হ'ল " সি # তে একটি কাস্টম বৈশিষ্ট্য কীভাবে তৈরি করা যায়"। উত্তরগুলি মোটেও সেই বিষয়টিতে আসে না। ২ য় উত্তর অন্যদিকে দেয়।
দ্রাকেষ্টার

আমি মনে করি দ্বিতীয় উত্তরটি প্রশ্নের সাথে আরও জড়িত।
মোহাম্মদ তাহেরিয়ান

267

আপনি অ্যাট্রিবিউট থেকে উদ্ভূত একটি ক্লাস লিখে শুরু করুন :

public class MyCustomAttribute: Attribute
{
    public string SomeProperty { get; set; }
}

তারপরে আপনি এই বৈশিষ্ট্যটি দিয়ে কোনও কিছু (শ্রেণি, পদ্ধতি, সম্পত্তি, ...) সাজাতে পারেন:

[MyCustomAttribute(SomeProperty = "foo bar")]
public class Foo
{

}

এবং অবশেষে আপনি এটি আনতে প্রতিচ্ছবি ব্যবহার করবেন:

var customAttributes = (MyCustomAttribute[])typeof(Foo).GetCustomAttributes(typeof(MyCustomAttribute), true);
if (customAttributes.Length > 0)
{
    var myAttribute = customAttributes[0];
    string value = myAttribute.SomeProperty;
    // TODO: Do something with the value
}

আপনি এই লক্ষ্যবস্তুগুলিকে সীমাবদ্ধ করতে পারেন যেখানে এই কাস্টম বৈশিষ্ট্যটি অ্যাট্রিবিউট ইউজেজ বৈশিষ্ট্যটি ব্যবহার করে প্রয়োগ করা যেতে পারে :

/// <summary>
/// This attribute can only be applied to classes
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class MyCustomAttribute : Attribute

গুণাবলী সম্পর্কে জানতে গুরুত্বপূর্ণ বিষয়গুলি:

  • বৈশিষ্ট্যগুলি মেটাডেটা।
  • সংকলন-সময়ে তারা সমাবেশে বেকড হয় যা কীভাবে আপনি তাদের সম্পত্তি সেট করতে পারেন তার মারাত্মক প্রভাব রয়েছে। কেবল ধ্রুবক (সংকলন সময়ে জানা) মানগুলি গৃহীত হয়
  • কাস্টম বৈশিষ্ট্যগুলির কোনও বোধগম্যতা এবং ব্যবহারের একমাত্র উপায় হ'ল প্রতিচ্ছবি ব্যবহার করা । সুতরাং আপনি যদি এগুলি আনার জন্য রানটাইমের সময় প্রতিবিম্ব ব্যবহার না করেন এবং কোনও কাস্টম বৈশিষ্ট্য সহ কিছু সাজাইয়া তেমন কিছু হওয়ার আশা করবেন না।
  • বৈশিষ্ট্যগুলি তৈরির সময়টি অ-সংঘবদ্ধ is এগুলি সিএলআর দ্বারা ইনস্ট্যান্ট হয় এবং এটিতে আপনার সম্পূর্ণ নিয়ন্ত্রণ নেই over

3
কোথায়, কোন ফাংশন / শ্রেণিতে আমি `এটি আনতে প্রতিবিম্ব ব্যবহার করব
হাসান এ ইউসেফ

@ হাসান এ ইউসুফ, উদাহরণস্বরূপ সত্তা ফ্রেমওয়ার্কে "কী" বৈশিষ্ট্য রয়েছে যা কাঠামোকে বলে: এই সম্পত্তিটিকে প্রাথমিক কী হিসাবে সম্মত করা উচিত। ওআরএম তৈরি করতে, গুণাবলী খুব সহায়ক
পার্সা

আপনি কীভাবে কোনও সম্পত্তিতে কোনও কাস্টম অ্যাট্রিবিউট অ্যাক্সেস করবেন না কোনও শ্রেণিতে?
ক্যানভাস

ডকস.মাইক্রোসফট.ইন- ইউএস / ডটনেট / স্ট্যান্ডার্ড / অ্যাট্রিবিউটস / ঠিক সম্পূর্ণতার জন্য, এই এমএসডিএন পৃষ্ঠাটি এটি খুব ভালভাবে সংক্ষিপ্তসার করেছে
বারে আক্কুর্ট

var value = typeof(Foo).GetCustomAttributes<MyCustomAttribute>().First().SomeProperty;
জেনেরিকের সাথে, ধরণেরগুলি

27

ডারিন দিমিত্রভের দুর্দান্ত প্রতিক্রিয়াটি ব্যবহার / অনুলিপি করা , কোনও শ্রেণীর জন্য নয় এমন কোনও সম্পত্তিতে একটি কাস্টম বৈশিষ্ট্য অ্যাক্সেস করার পদ্ধতি এটি:

সজ্জিত সম্পত্তি [শ্রেনীর Foo]:

[MyCustomAttribute(SomeProperty = "This is a custom property")]
public string MyProperty { get; set; }

এটি আনছে:

PropertyInfo propertyInfo = typeof(Foo).GetProperty(propertyToCheck);
object[] attribute = propertyInfo.GetCustomAttributes(typeof(MyCustomAttribute), true);
if (attribute.Length > 0)
{
    MyCustomAttribute myAttribute = (MyCustomAttribute)attribute[0];
    string propertyValue = myAttribute.SomeProperty;
}

আপনি এটিকে একটি লুপে ফেলে দিতে পারেন এবং শ্রেণীর প্রতিটি সম্পত্তিতে এই কাস্টম বৈশিষ্ট্যটি অ্যাক্সেস করতে প্রতিবিম্বটি ব্যবহার করতে পারেন Foo:

foreach (PropertyInfo propertyInfo in Foo.GetType().GetProperties())
{
    string propertyName = propertyInfo.Name;

    object[] attribute = propertyInfo.GetCustomAttributes(typeof(MyCustomAttribute), true);
    // Just in case you have a property without this annotation
    if (attribute.Length > 0)
    {
        MyCustomAttribute myAttribute = (MyCustomAttribute)attribute[0];
        string propertyValue = myAttribute.SomeProperty;
        // TODO: whatever you need with this propertyValue
    }
}

আপনাকে অনেক ধন্যবাদ, দারিন !!


আমরা কোনও সম্পত্তিতে কী ধরণের গুণাবলী বিদ্যমান তা না জানলে আমরা কীভাবে এটি প্রসারিত করব? object[] attribute = propertyInfo.GetCustomAttributes(typeof(???), true);আমি কেবল তাদের সকলের সাথে পুনরাবৃত্তি করতে এবং m1()প্রতিটি অজানা বৈশিষ্ট্যের একটি পদ্ধতি কল করতে চাই
heyNow

0

সংক্ষিপ্ত উত্তরটি সি # তে একটি বৈশিষ্ট্য তৈরি করার জন্য আপনাকে কেবল এট্রিবিউট শ্রেণি থেকে উত্তরাধিকারী হওয়া দরকার, কেবল এটি :)

তবে এখানে আমি বিশদগুলি বিশদে ব্যাখ্যা করতে যাচ্ছি:

মূলত বৈশিষ্ট্যগুলি এমন শ্রেণি যা আমরা তাদের যুক্তি সমাবেশ, শ্রেণি, পদ্ধতি, বৈশিষ্ট্য, ক্ষেত্রগুলিতে আমাদের যুক্তি প্রয়োগের জন্য ব্যবহার করতে পারি ...

নেট, মাইক্রোসফ্ট যেমন ([প্রয়োজনীয়], [স্ট্রিংলেন্থ (100)], [রেঞ্জ (0, 999.99)] এর মতো কিছু পূর্বনির্ধারিত বৈশিষ্ট্য সরবরাহ করেছে যেমন এসপনেটে অ্যাকশনফিল্টারের মতো বৈশিষ্ট্যও রয়েছে we এটি আমাদের কোডগুলিতে আমাদের কাঙ্ক্ষিত যুক্তি প্রয়োগের জন্য খুব কার্যকর হতে পারে ( যদি আপনি এটি জানতে আগ্রহী হন তবে অ্যাকশন ফিল্টারগুলি সম্পর্কে এই নিবন্ধটি পড়ুন )

অন্য একটি বিষয়, আপনি AttibuteUsage এর মাধ্যমে আপনার অ্যাট্রিবিউটে এক ধরণের কনফিগারেশন প্রয়োগ করতে পারেন।

  [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = true)]

আপনি যখন অ্যাট্রিবিউট ইউজেজের সাথে একটি অ্যাট্রিবিউট ক্লাস সাজাইয়া থাকেন তখন আপনি সি # সংকলককে বলতে পারেন যেখানে আমি এই বৈশিষ্ট্যটি ব্যবহার করতে যাচ্ছি: আমি ক্লাসে, বৈশিষ্ট্যগুলিতে বা সম্মেলনে ... এটি ব্যবহার করতে যাচ্ছি এবং আমার বৈশিষ্ট্যটি ব্যবহারের অনুমতি দেওয়া হয়েছে সংজ্ঞায়িত লক্ষ্য (ক্লাস, সমাবেশ, বৈশিষ্ট্য, ...) উপর বেশ কয়েকবার বা না ?!

বৈশিষ্ট্য সম্পর্কে এই সংজ্ঞার পরে আমি আপনাকে একটি উদাহরণ দেখাচ্ছি: কল্পনা করুন যে আমরা বিশ্ববিদ্যালয়ে একটি নতুন পাঠ সংজ্ঞায়িত করতে চাই এবং আমরা আমাদের বিশ্ববিদ্যালয়ে কেবল প্রশাসক এবং মাস্টারদের একটি নতুন পাঠ সংজ্ঞায়িত করতে চাই, ঠিক আছে?

namespace ConsoleApp1
{
    /// <summary>
    /// All Roles in our scenario
    /// </summary>
    public enum UniversityRoles
    {
        Admin,
        Master,
        Employee,
        Student
    }

    /// <summary>
    /// This attribute will check the Max Length of Properties/fields
    /// </summary>
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = true)]
    public class ValidRoleForAccess : Attribute
    {
        public ValidRoleForAccess(UniversityRoles role)
        {
            Role = role;
        }
        public UniversityRoles Role { get; private set; }

    }


    /// <summary>
    /// we suppose that just admins and masters can define new Lesson
    /// </summary>
    [ValidRoleForAccess(UniversityRoles.Admin)]
    [ValidRoleForAccess(UniversityRoles.Master)]
    public class Lesson
    {
        public Lesson(int id, string name, DateTime startTime, User owner)
        {
            var lessType = typeof(Lesson);
            var validRolesForAccesses = lessType.GetCustomAttributes<ValidRoleForAccess>();

            if (validRolesForAccesses.All(x => x.Role.ToString() != owner.GetType().Name))
            {
                throw new Exception("You are not Allowed to define a new lesson");
            }
            
            Id = id;
            Name = name;
            StartTime = startTime;
            Owner = owner;
        }
        public int Id { get; private set; }
        public string Name { get; private set; }
        public DateTime StartTime { get; private set; }

        /// <summary>
        /// Owner is some one who define the lesson in university website
        /// </summary>
        public User Owner { get; private set; }

    }

    public abstract class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime DateOfBirth { get; set; }
    }


    public class Master : User
    {
        public DateTime HireDate { get; set; }
        public Decimal Salary { get; set; }
        public string Department { get; set; }
    }

    public class Student : User
    {
        public float GPA { get; set; }
    }



    class Program
    {
        static void Main(string[] args)
        {

            #region  exampl1

            var master = new Master()
            {
                Name = "Hamid Hasani",
                Id = 1,
                DateOfBirth = new DateTime(1994, 8, 15),
                Department = "Computer Engineering",
                HireDate = new DateTime(2018, 1, 1),
                Salary = 10000
            };
            var math = new Lesson(1, "Math", DateTime.Today, master);

            #endregion

            #region exampl2
            var student = new Student()
            {
                Name = "Hamid Hasani",
                Id = 1,
                DateOfBirth = new DateTime(1994, 8, 15),
                GPA = 16
            };
            var literature = new Lesson(2, "literature", DateTime.Now.AddDays(7), student);
            #endregion

            ReadLine();
        }
    }


}

প্রোগ্রামিংয়ের আসল বিশ্বে আমরা বৈশিষ্ট্যগুলি ব্যবহারের জন্য এই পদ্ধতিকে ব্যবহার করি না এবং বৈশিষ্ট্যগুলি ব্যবহার করার ক্ষেত্রে এটির শিক্ষাগত কারণেই আমি এটি বলেছিলাম

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