আমি প্রচুর বার চেষ্টা করেছি কিন্তু তবুও আমি কাস্টম বৈশিষ্ট্যগুলির ব্যবহার বুঝতে সক্ষম নই (আমি ইতিমধ্যে প্রচুর লিঙ্ক দিয়ে গিয়েছি)।
কেউ দয়া করে আমাকে কোড সহ একটি কাস্টম অ্যাট্রিবিউটের খুব মৌলিক উদাহরণটি ব্যাখ্যা করতে পারেন?
আমি প্রচুর বার চেষ্টা করেছি কিন্তু তবুও আমি কাস্টম বৈশিষ্ট্যগুলির ব্যবহার বুঝতে সক্ষম নই (আমি ইতিমধ্যে প্রচুর লিঙ্ক দিয়ে গিয়েছি)।
কেউ দয়া করে আমাকে কোড সহ একটি কাস্টম অ্যাট্রিবিউটের খুব মৌলিক উদাহরণটি ব্যাখ্যা করতে পারেন?
উত্তর:
একটি কাস্টম অ্যাট্রিবিউট তৈরি করার কোডটি মোটামুটি সহজ হলেও এট্রিবিউটগুলি কী কী তা আপনার বোঝা খুব গুরুত্বপূর্ণ:
বৈশিষ্ট্যগুলি আপনার প্রোগ্রামে সংকলিত মেটাডাটা। বৈশিষ্ট্যগুলি এগুলি কোনও শ্রেণি, সম্পত্তি বা মডিউলে কোনও কার্যকারিতা যুক্ত করে না - কেবল ডেটা। যাইহোক, প্রতিবিম্ব ব্যবহার করে, কার্যকারিতা তৈরির জন্য কেউ এই বৈশিষ্ট্যগুলি লাভ করতে পারে।
সুতরাং, উদাহরণস্বরূপ, চলুন মাইক্রোসফ্টের এন্টারপ্রাইজ লাইব্রেরি থেকে বৈধকরণ অ্যাপ্লিকেশন ব্লকটি দেখুন । আপনি যদি একটি কোড উদাহরণটি দেখেন তবে আপনি দেখতে পাবেন:
/// <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
পদ্ধতি রয়েছে যা আপনার অবজেক্টটি সন্ধান করবে এবং প্রতিটি সম্পত্তির জন্য, বিষয়বস্তুগুলি অ্যাট্রিবিউট দ্বারা জানানো নিয়ম লঙ্ঘন করেছে কিনা তা এটি পরীক্ষা করবে।
সুতরাং, আপনাকে বৈশিষ্ট্যগুলি সম্পর্কে এইভাবে ভাবতে হবে - আপনার কোডে ডেটা যুক্ত করার একটি উপায় যা পরে অন্যান্য পদ্ধতি / শ্রেণি / ইত্যাদি দ্বারা ব্যবহৃত হতে পারে।
আপনি অ্যাট্রিবিউট থেকে উদ্ভূত একটি ক্লাস লিখে শুরু করুন :
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
গুণাবলী সম্পর্কে জানতে গুরুত্বপূর্ণ বিষয়গুলি:
var value = typeof(Foo).GetCustomAttributes<MyCustomAttribute>().First().SomeProperty;
ডারিন দিমিত্রভের দুর্দান্ত প্রতিক্রিয়াটি ব্যবহার / অনুলিপি করা , কোনও শ্রেণীর জন্য নয় এমন কোনও সম্পত্তিতে একটি কাস্টম বৈশিষ্ট্য অ্যাক্সেস করার পদ্ধতি এটি:
সজ্জিত সম্পত্তি [শ্রেনীর 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()
প্রতিটি অজানা বৈশিষ্ট্যের একটি পদ্ধতি কল করতে চাই
সংক্ষিপ্ত উত্তরটি সি # তে একটি বৈশিষ্ট্য তৈরি করার জন্য আপনাকে কেবল এট্রিবিউট শ্রেণি থেকে উত্তরাধিকারী হওয়া দরকার, কেবল এটি :)
তবে এখানে আমি বিশদগুলি বিশদে ব্যাখ্যা করতে যাচ্ছি:
মূলত বৈশিষ্ট্যগুলি এমন শ্রেণি যা আমরা তাদের যুক্তি সমাবেশ, শ্রেণি, পদ্ধতি, বৈশিষ্ট্য, ক্ষেত্রগুলিতে আমাদের যুক্তি প্রয়োগের জন্য ব্যবহার করতে পারি ...
নেট, মাইক্রোসফ্ট যেমন ([প্রয়োজনীয়], [স্ট্রিংলেন্থ (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();
}
}
}
প্রোগ্রামিংয়ের আসল বিশ্বে আমরা বৈশিষ্ট্যগুলি ব্যবহারের জন্য এই পদ্ধতিকে ব্যবহার করি না এবং বৈশিষ্ট্যগুলি ব্যবহার করার ক্ষেত্রে এটির শিক্ষাগত কারণেই আমি এটি বলেছিলাম