প্রদত্ত বৈশিষ্ট্যযুক্ত বৈশিষ্ট্যগুলির তালিকা কীভাবে পাবেন?


210

আমার একটি প্রকার রয়েছে tএবং আমি সর্বজনীন বৈশিষ্ট্যগুলির একটি তালিকা পেতে চাই যাতে বৈশিষ্ট্য রয়েছে MyAttribute। বৈশিষ্ট্যটি এর সাথে চিহ্নিত করা হয়েছে AllowMultiple = false:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]

বর্তমানে আমার যা আছে তা হ'ল তবে আমি ভাবছি এর থেকে আরও ভাল উপায় আছে:

foreach (PropertyInfo prop in t.GetProperties())
{
    object[] attributes = prop.GetCustomAttributes(typeof(MyAttribute), true);
    if (attributes.Length == 1)
    {
         //Property with my custom attribute
    }
}

আমি কীভাবে এটি উন্নতি করতে পারি? আমার ক্ষমা যদি এটি একটি সদৃশ হয়, সেখানে প্রতি টাক প্রতিবিম্বের থ্রেড রয়েছে ... মনে হচ্ছে এটি বেশ উত্তপ্ত বিষয়।


নাঃ। সম্পত্তির কোনও বৈশিষ্ট্য আছে কিনা তা খুঁজে বের করার আগে আপনার একটি সম্পত্তিআইফোন দরকার।
হান্স প্যাস্যান্ট

উত্তর:


391
var props = t.GetProperties().Where(
                prop => Attribute.IsDefined(prop, typeof(MyAttribute)));

এটি কোনও অ্যাট্রিবিউট উদাহরণগুলি বাস্তবায়িত করা এড়িয়ে চলে (যেমন এটি তুলনায় সস্তা GetCustomAttribute[s]()


1
ভাল পরামর্শ। আমার অবশ্য বৈশিষ্ট্যের উদাহরণটি প্রয়োজন তবে এটি আমার পছন্দ like
wsanville

1
আমি সম্পত্তিটির যে পার্শ্ব-প্রতিক্রিয়াটি বলে তাকে ডাকা হচ্ছে না বলে কেবলমাত্র একটি বৈশিষ্ট্যের অস্তিত্ব যাচাই করার জন্য আমি একটি উপায় সন্ধান করছিলাম। ধন্যবাদ মার্ক, এটা কাজ!
janrjan Jämte

1
@ JanrjanJämte সম্পত্তি getব্যবহার করার পরেও বলা হয় না GetCustomAttributes; তবে, গুণটি তাত্ক্ষণিকভাবে নিখরচায়িত হয় যা নিখরচায় নয়। আপনার যদি গুনের নির্দিষ্ট মানগুলি পরীক্ষা করার প্রয়োজন না হয় তবে IsDefinedএটি সস্তা is এবং ৪.৪-তে, কোনও বৈশিষ্ট্য উদাহরণ তৈরি না করেই ইনস্ট্যান্টেশন তথ্য যাচাই করার উপায় রয়েছে (যদিও এটি শুধুমাত্র খুব নির্দিষ্ট পরিস্থিতির জন্যই উদ্দিষ্ট )
মার্ক গ্র্যাভেল


2
ডটনেট কোরের জন্য: var প্রপস = t.GetProperties () Where যেখানে (e => e.আইএসডিফাইন্ড (টাইপফ (মাইএট্রিবিউট)));
Rtype

45

আমি যে সমাধানটি সর্বাধিক ব্যবহার করে শেষ করি তা টমাস পেট্রিসেকের উত্তরের ভিত্তিতে তৈরি। আমি সাধারণত বৈশিষ্ট্য এবং সম্পত্তি উভয়ই কিছু করতে চাই ।

var props = from p in this.GetType().GetProperties()
            let attr = p.GetCustomAttributes(typeof(MyAttribute), true)
            where attr.Length == 1
            select new { Property = p, Attribute = attr.First() as MyAttribute};

+1 - "আমি সাধারণত বৈশিষ্ট্য এবং সম্পত্তি উভয়ই কিছু করতে চাই" আমি যা খুঁজছিলাম তা - আপনার উত্তর পোস্ট করার জন্য অনেক ধন্যবাদ!
ইয়াওয়ার মুর্তজা

34

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

var props = from p in t.GetProperties()
            let attrs = p.GetCustomAttributes(typeof(MyAttribute), true)
            where attrs.Length != 0 select p;

// Do something with the properties in 'props'

আমি বিশ্বাস করি এটি আপনাকে আরও পঠনযোগ্য ফ্যাশনে কোড গঠনে সহায়তা করে।


13

লিনকিউ সবসময় থাকে:

t.GetProperties().Where(
    p=>p.GetCustomAttributes(typeof(MyAttribute), true).Length != 0)

6

আপনি যদি প্রতিবিম্বের বৈশিষ্ট্যের সাথে নিয়মিত ডিল করেন তবে কিছু এক্সটেনশন পদ্ধতি সংজ্ঞায়িত করা খুব বাস্তব। আপনি দেখতে পাবেন যে সেখানে অনেক প্রকল্পে। এই এখানে আমার কাছে প্রায়শই থাকে:

public static bool HasAttribute<T>(this ICustomAttributeProvider provider) where T : Attribute
{
  var atts = provider.GetCustomAttributes(typeof(T), true);
  return atts.Length > 0;
}

যা আপনি পছন্দ করতে পারেন typeof(Foo).HasAttribute<BarAttribute>();

অন্যান্য প্রকল্পগুলিতে (যেমন স্ট্রাকচারম্যাপ) পূর্ণ বর্ধিত প্রতিচ্ছবি হেল্পার ক্লাস থাকে যা এক্সপ্রেশন ট্রি ব্যবহার করে সনাক্তকরণের জন্য সূক্ষ্ম বাক্য গঠন করে যেমন প্রপার্টিআইএনফোস। ব্যবহারের পরে এটির মতো দেখাচ্ছে:

ReflectionHelper.GetProperty<Foo>(x => x.MyProperty).HasAttribute<BarAttribute>()

2

পূর্ববর্তী উত্তরগুলি ছাড়াও: Any()সংগ্রহের দৈর্ঘ্যের পরিবর্তে পদ্ধতিটি ব্যবহার করা ভাল :

propertiesWithMyAttribute = type.GetProperties()
  .Where(x => x.GetCustomAttributes(typeof(MyAttribute), true).Any());

ডটনেটফিডালে উদাহরণ: https://dotnetfiddle.net/96mKep


@ cogumel0 প্রথমত, নিশ্চিত .Any()যে দৈর্ঘ্য পরীক্ষা করে না। তবে আমার উত্তরটি হ'ল একটি বৈশিষ্ট্যযুক্ত বৈশিষ্ট্য সম্পর্কে নয়। দ্বিতীয়ত, আমি নিশ্চিত নই যে আপনি কোডটি সঠিকভাবে পড়েছেন - .Anyপদ্ধতির ফলাফলটির জন্য ডাকা হয় GetCustomAttrubutes। সুতরাং প্রকারভেদগুলির propertiesWithMyAttributeসংকলন হবে। ডটনেটফিডালে উদাহরণটি দেখুন (আমি উত্তরের লিঙ্কটি যুক্ত করছি)।
ফিপিয়ার

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