خصائص C# 3.0 التلقائية - هل من الممكن إضافة سلوك مخصص؟

StackOverflow https://stackoverflow.com/questions/116142

سؤال

أرغب في معرفة ما إذا كانت هناك أي طريقة لإضافة سلوك مخصص إلى أساليب الحصول على/تعيين الخاصية التلقائية.

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

أتساءل بشكل أساسي عما إذا كان هناك أي شيء مشابه لقالب get/set أو ربط get/set مع نطاق الفصل.

(أعلم أنه يمكن تحقيق نفس الوظيفة النهائية بسهولة بطرق أكثر تفصيلاً - أنا فقط أكره تكرار النمط)

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

المحلول

لا، سيتعين عليك استخدام تعريفات الخصائص "التقليدية" للسلوك المخصص.

نصائح أخرى

لا لا يمكنك :الخاصية التلقائية هي اختصار لموصل صريح إلى حقل خاص.على سبيل المثال

public string Name { get; set;} 

هو اختصار ل

private string _name;
public string Name { get { return _name; } set { _name = value; } };

إذا كنت تريد وضع منطق مخصص، فيجب عليك كتابة get وتعيين بشكل صريح.

انظر الى بوستشارب.إنه إطار عمل AOP للمشكلة النموذجية "نمط التعليمات البرمجية هذا الذي أقوم به مئات المرات يوميًا، كيف يمكنني تشغيله تلقائيًا؟".يمكنك تبسيط هذا باستخدام PostSharp (على سبيل المثال):

public Class1 DoSomething( Class2 first, string text, decimal number ) {
    if ( null == first ) { throw new ArgumentNullException( "first" ); }
    if ( string.IsNullOrEmpty( text ) ) { throw new ArgumentException( "Must be not null and longer than 0.", "text" ) ; }
    if ( number < 15.7m || number > 76.57m ) { throw new OutOfRangeArgumentException( "Minimum is 15.7 and maximum 76.57.", "number"); }

    return new Class1( first.GetSomething( text ), number + text.Lenght );
}

ل

    public Class1 DoSomething( [NotNull]Class2 first, [NotNullOrEmpty]string text, [InRange( 15.7, 76.57 )]decimal number ) {
        return new Class1( first.GetSomething( text ), number + text.Lenght );
}

لكن هذا ليس كل شيء!:)

إذا كان هذا سلوكًا ستكرره كثيرًا أثناء التطوير، فيمكنك إنشاء مقتطف رمز مخصص لنوع خاص من الممتلكات الخاصة بك.

هل يمكن أن تفكر في استخدام بوستشارب لكتابة اعتراضات المستوطنين.إنه LGPL وGPLed اعتمادًا على أجزاء المكتبة التي تستخدمها.

الحل الأقرب الذي يمكنني التفكير فيه هو استخدام طريقة مساعدة:

public void SetProperty<T>(string propertyName, ref T field, T value)
 { field = value;
   NotifyPropertyChanged(propertyName);
 }

public Foo MyProperty 
 { get { return _myProperty}
   set { SetProperty("MyProperty",ref _myProperty, value);}
 } Foo _myProperty;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top