سؤال

ما هي السمات في .صافي ما هي و كيف يمكنني إنشاء بلدي السمات ؟

هل كانت مفيدة؟

المحلول

البيانات الوصفية.بيانات عن الكائنات/طرق/خصائص.

على سبيل المثال قد تعلن سمة يسمى:DisplayOrder لذلك أنا يمكن بسهولة التحكم في خصائص يجب أن تظهر في واجهة المستخدم.أنا لا يمكن إلحاقها إلى الدرجة كتابة بعض مكونات واجهة المستخدم الرسومية أن استخراج سمات النظام عناصر واجهة المستخدم على نحو ملائم.

public class DisplayWrapper
{
    private UnderlyingClass underlyingObject;

    public DisplayWrapper(UnderlyingClass u)
    {
        underlyingObject = u;
    }

    [DisplayOrder(1)]
    public int SomeInt
    {
        get
        {
            return underlyingObject .SomeInt;
        }
    }

    [DisplayOrder(2)]
    public DateTime SomeDate
    {
        get
        {
            return underlyingObject .SomeDate;
        }
    }
}

وبالتالي ضمان أن SomeInt يتم عرضها دائما قبل SomeDate عند العمل مع بلدي مخصص مكونات واجهة المستخدم الرسومية.

ومع ذلك, سوف نراهم الأكثر شيوعا خارج المباشر الترميز البيئة.على سبيل المثال ويندوز مصمم يستخدم على نطاق واسع حتى يعرف كيفية التعامل مع العرف الكائنات.باستخدام BrowsableAttribute مثل ذلك:

[Browsable(false)]
public SomeCustomType DontShowThisInTheDesigner
{
    get{/*do something*/}
}

يقول المصمم أن لا قائمة هذا في الخصائص المتوفرة في الإطار "خصائص" في وقت التصميم على سبيل المثال.

لك يمكن أن أيضا استخدامها رمز الجيل ما قبل تجميع العمليات (مثل وظيفة حادة) أو وقت تشغيل العمليات مثل التفكير.تنبعث منها.على سبيل المثال ، يمكنك كتابة قليلا من رمز التنميط بشفافية ملفوفة كل استدعاء التعليمات البرمجية الخاصة بك ويجعل مرات.يمكنك أن تختار توقيت عبر السمة التي على طرق معينة.

public void SomeProfilingMethod(MethodInfo targetMethod, object target, params object[] args)
{
    bool time = true;
    foreach (Attribute a in target.GetCustomAttributes())
    {
        if (a.GetType() is NoTimingAttribute)
        {
            time = false;
            break;
        }
    }
    if (time)
    {
        StopWatch stopWatch = new StopWatch();
        stopWatch.Start();
        targetMethod.Invoke(target, args);
        stopWatch.Stop();
        HandleTimingOutput(targetMethod, stopWatch.Duration);
    }
    else
    {
        targetMethod.Invoke(target, args);
    }
}

معلنا لهم سهل, فقط جعل فئة يرث من السمة.

public class DisplayOrderAttribute : Attribute
{
    private int order;

    public DisplayOrderAttribute(int order)
    {
        this.order = order;
    }

    public int Order
    {
        get { return order; }
    }
}

و تذكر أنه عند استخدام السمة يمكنك حذف لاحقة "سمة" المترجم سوف تضيف لك.

ملاحظة: سمات لا تفعل شيئا من تلقاء نفسها - يجب أن يكون هناك بعض التعليمات البرمجية الأخرى التي تستخدم لهم.في بعض الأحيان هذا الرمز قد كتب لك لكن في بعض الأحيان يجب عليك كتابة ذلك بنفسك.على سبيل المثال, C# compiler يهتم بعض و بعض أطر أطر استخدام بعض (مثلا ، NUnit يبحث عن [TestFixture] على فئة و [اختبار] على طريقة الاختبار عند تحميل التجميع).
لذلك عند إنشاء الخاصة بك "سمة مخصصة" أن يكون على علم أنه لن يكون لها تأثير على سلوك التعليمات البرمجية الخاصة بك على الإطلاق.سوف تحتاج إلى كتابة الجزء الآخر الذي يتحقق من سمات (عن طريق التفكير) والتصرف بناء عليها.

نصائح أخرى

كثير من الناس قد أجبت ولكن لا أحد قد ذكرت هذا حتى الآن...

سمات تستخدم بشكل كبير مع التأمل.التفكير هو بالفعل بطيئة جدا.

فمن من المفيد جدا بمناسبة الخاص بك سمات مخصصة كما يجري sealed دروس تحسين وقت الأداء.

بل هو أيضا فكرة جيدة للنظر حيث أنه سيكون من المناسب استخدام هذه السمة إلى السمة السمة الخاصة بك (!) للإشارة إلى هذا عن طريق AttributeUsage.قائمة المتاحة السمة الأعراف قد مفاجأة لك:

  • الجمعية
  • وحدة
  • الدرجة
  • البنية
  • التعداد
  • منشئ
  • طريقة
  • الملكية
  • المجال
  • الحدث
  • واجهة
  • المعلمة
  • مندوب
  • ReturnValue
  • GenericParameter
  • كل

كما انها باردة أن AttributeUsage السمة هي جزء من AttributeUsage السمة المميزة.قف على تبعيات دائرية!

[AttributeUsageAttribute(AttributeTargets.Class, Inherited = true)]
public sealed class AttributeUsageAttribute : Attribute

سمات هي نوع من البيانات الوصفية عن علامات الطبقات.هذا هو غالبا ما تستخدم في WinForms على سبيل المثال إلى إخفاء عناصر التحكم من شريط الأدوات ، ولكن يمكن تنفيذها في التطبيق الخاص بك لتمكين الحالات من فئات مختلفة على التصرف بطرق معينة.

تبدأ من خلال خلق سمة:

[AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=true)]
public class SortOrderAttribute : Attribute
{
    public int SortOrder { get; set; }

    public SortOrderAttribute(int sortOrder)
    {
        this.SortOrder = sortOrder;
    }
}

كل سمة الطبقات يجب أن تكون لاحقة "سمة" أن تكون سارية المفعول.
بعد ذلك يتم إنشاء الفئة التي تستخدم السمة.

[SortOrder(23)]
public class MyClass
{
    public MyClass()
    {
    }
}

الآن يمكنك التحقق من فئة معينة' SortOrderAttribute (إذا كان لديه واحد) عن طريق القيام بما يلي:

public class MyInvestigatorClass
{
    public void InvestigateTheAttribute()
    {
        // Get the type object for the class that is using
        // the attribute.
        Type type = typeof(MyClass);

        // Get all custom attributes for the type.
        object[] attributes = type.GetCustomAttributes(
            typeof(SortOrderAttribute), true);

        // Now let's make sure that we got at least one attribute.
        if (attributes != null && attributes.Length > 0)
        {
            // Get the first attribute in the list of custom attributes
            // that is of the type "SortOrderAttribute". This should only
            // be one since we said "AllowMultiple=false".
            SortOrderAttribute attribute = 
                attributes[0] as SortOrderAttribute;

            // Now we can get the sort order for the class "MyClass".
            int sortOrder = attribute.SortOrder;
        }
    }
}

إذا كنت ترغب في قراءة المزيد حول هذا الموضوع يمكنك دائما التحقق من MSDN الذي وصف جيد جدا.
آمل أن يكون هذا ساعد على الخروج!

سمة هي الطبقة التي تحتوي على بعض الوظائف التي يمكن تطبيقها على الكائنات في التعليمات البرمجية الخاصة بك.إنشاء واحد ، إنشاء فئة يرث من النظام.السمة.

أما ما انها جيدة...هناك تقريبا لا حدود لها استخدامات لهم.

http://www.codeproject.com/KB/cs/dotnetattributes.aspx

سمات مثل الفوقية تطبيق دروس أساليب أو الجمعيات.

فهي جيدة من أجل أي عدد من الأشياء (المصحح التصور ، بمناسبة أشياء عفا عليها الزمن ، بمناسبة الأشياء كما للتسلسل قائمة لا نهاية لها).

إنشاء الخاص بك مخصص منها سهلا كما فطيرة.تبدأ هنا:

http://msdn.microsoft.com/en-us/library/sw480ze8(مقابل.71).aspx

في مشروع أعمل عليها حاليا ، هناك مجموعة من الكائنات واجهة المستخدم من مختلف النكهات محررا الجمعية هذه الكائنات لإنشاء صفحات للاستخدام في التطبيق الرئيسي ، قليلا مثل مصمم النموذج في DevStudio.هذه الكائنات موجودة في بلدهم الجمعية و كل كائن فئة مشتقة من UserControl ولها سمة مخصصة.هذه السمة المحددة مثل هذا:

[AttributeUsage (AttributeTargets::Class)]
public ref class ControlDescriptionAttribute : Attribute
{
public:
  ControlDescriptionAttribute (String ^name, String ^description) :
    _name (name),
    _description (description)
  {
  }

  property String ^Name
  {
    String ^get () { return _name; }
  }

  property String ^Description
  {
    String ^get () { return _description; }
  }

private:
  String
    ^ _name,
    ^ _description;
};

وأنا تطبيقه على فئة مثل هذا:

[ControlDescription ("Pie Chart", "Displays a pie chart")]
public ref class PieControl sealed : UserControl
{
  // stuff
};

وهو ما السابقة الملصقات قال.

إلى استخدام السمة ، محرر لديه Generic::List <Type> التي تحتوي على أنواع الرقابة.هناك مربع القائمة التي يمكن للمستخدم سحب من وإسقاط على الصفحة إنشاء مثيل من عنصر التحكم.إلى تعبئة مربع قائمة فهمت ControlDescriptionAttribute من أجل السيطرة وملء إدخال في القائمة:

// done for each control type
array <Object ^>
  // get all the custom attributes
  ^attributes = controltype->GetCustomAttributes (true);

Type
  // this is the one we're interested in
  ^attributetype = ECMMainPageDisplay::ControlDescriptionAttribute::typeid;

// iterate over the custom attributes
for each (Object ^attribute in attributes)
{
  if (attributetype->IsInstanceOfType (attribute))
  {
    ECMMainPageDisplay::ControlDescriptionAttribute
      ^description = safe_cast <ECMMainPageDisplay::ControlDescriptionAttribute ^> (attribute);

    // get the name and description and create an entry in the list
    ListViewItem
      ^item = gcnew ListViewItem (description->Name);

    item->Tag = controltype->Name;
    item->SubItems->Add (description->Description);

    mcontrols->Items->Add (item);
    break;
  }
}

ملاحظة:أعلاه هو C++/CLI ولكن ليس من الصعب تحويل إلى C# (نعم, أعرف, C++/CLI رجس ولكن هذا ما يجب أن تعمل مع :-( )

يمكنك وضع السمات على معظم الأشياء وهناك مجموعة كاملة من سمات محددة مسبقا.المحرر المذكور أعلاه أيضا يبحث عن السمات المخصصة على الخصائص التي تصف الملكية و كيفية تحريره.

مرة واحدة يمكنك الحصول على فكرة كاملة ، فسوف أتساءل كيف كنت من أي وقت مضى يعيش بدونها.

كما قال سمات من السهل نسبيا لخلق.الجزء الآخر من هذا العمل هو إنشاء التعليمات البرمجية التي تستخدم في ذلك.في معظم الحالات سوف تستخدم انعكاس في وقت لتغيير السلوك على أساس وجود سمة أو خصائصه.هناك أيضا سيناريوهات حيث سيتم فحص السمات على التعليمات البرمجية المترجمة إلى القيام ببعض النوع من تحليل ثابت.على سبيل المثال, المعلمات قد تكون علامة على أنها غير خالية و أداة تحليل يمكن استخدام هذا كما تلميحا.

باستخدام سمات معرفة السيناريوهات الملائمة لاستخدامها هو الجزء الأكبر من العمل.

سمات هي ، في جوهرها ، بت من البيانات التي تريد إرفاق الخاص بك أنواع (الطبقات, طرق, الأحداث, enums ، إلخ.)

والفكرة هي أنه في وقت التشغيل نوع آخر/إطار/أداة الاستعلام الخاص بك نوع المعلومات في السمة والتصرف بناء على ذلك.

لذا, فعلى سبيل المثال, Visual Studio يمكن الاستعلام عن سمات 3rd الطرف السيطرة على معرفة خصائص عنصر التحكم يجب أن تظهر في الجزء خصائص في وقت التصميم.

سمات يمكن أن تستخدم أيضا في الجانب برمجة لحقن/التعامل مع الكائنات في وقت التشغيل على أساس السمات التي تزين لهم و إضافة التحقق من صحة التسجيل ، إلخ.إلى الأشياء دون التأثير على منطق الأعمال من وجوه.

يمكنك استخدام السمات المخصصة حسب طريقة بسيطة لتحديد الوسم القيم في فئات فرعية دون الحاجة إلى كتابة نفس الكود مرارا وتكرارا لكل فئة فرعية.جئت عبر لطيفة موجزة سبيل المثال جون المياه كيفية تحديد استخدام سمات مخصصة في التعليمات البرمجية الخاصة بك.

هناك برنامج تعليمي في http://msdn.microsoft.com/en-us/library/aa288454(مقابل.71).aspx

البدء في إنشاء سمة فتح C# مصدر الملف, نوع attribute وضرب [TAB].فإنه سيتم توسيع قالب سمة جديدة.

الصفات هي أيضا تستخدم عادة في جانب البرمجة الموجهة.للحصول على مثال هذا تحقق PostSharp المشروع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top