سؤال

أنا أعمل على الأسلوب الذي يقبل شجرة التعبير كمعلمة ، جنبا إلى جنب مع نوع (أو مثيل) من فئة.

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

public interface ITestInterface
{
    //Specify stuff here.
}

private static void DoSomething<T>(Expression<Func<T, object>> expression, params IMyInterface[] rule)
{
    // Stuff is done here.
}

طريقة ويطلق على النحو التالي:

class TestClass
{
    public int MyProperty { get; set; }
}

class OtherTestClass  : ITestInterface
{
    // Blah Blah Blah.
}

static void Main(string[] args)
{
    DoSomething<TestClass>(t => t.MyProperty, 
        new OtherTestClass());
}

أنا بهذه الطريقة لأنني أود للملكية الأسماء التي مرت في أن تكون قوية كتبته.

بضعة أشياء أنا تكافح مع..

  1. ضمن DoSomething أود الحصول على PropertyInfo نوع (من الجسم مرت في) T وإضافته إلى مجموعة جنبا إلى جنب مع القاعدة[].حاليا أنا أفكر في استخدام التعبير.الجسم وإزالة [propertyname] من "تحويل.([propertyname])" واستخدام التفكير للحصول على ما أريد.هذا يبدو مرهقة و الخطأ.هل هناك طريقة أفضل ؟
  2. هذا نمط معين أستخدمه ؟
  3. وأخيرا أي اقتراحات أو توضيحات عن سوء فهم ما أفعله هي محل تقدير و / أو موارد أو معلومات جيدة في C# أشجار التعبير هي محل تقدير أيضا.

وذلك بفضل!

إيان

تحرير:

مثال على ما expression.Body.ToString() العودة ضمن DoSomething الأسلوب هو السلسلة التي تحتوي على "تحويل(تي.MyProperty)" إذا دعا من المثال أعلاه.

أنا بحاجة إلى أن يكون كتبته بقوة لذلك لن ترجمة إذا قمت بتغيير اسم الخاصية.

شكرا على الاقتراحات!

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

المحلول

جمع PropertyInfo الكائنات من التعبير.الجسم يبدو مشابهة الحل إلى آخر السؤال.

نصائح أخرى

أنا أعتمد بشكل كبير على أشجار التعبير إلى دفع الكثير من ما أريد القيام به مع بلدي التطبيق الحالي إلى تجميع الوقت ، أيثابت نوع التحقق.

أنا اجتياز التعبير الأشجار إلى ترجمتها إلى شيء آخر وهو "المنطقي".

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

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

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

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

مرة واحدة يمكنك الحصول على أن الذهاب هناك القليل لا يمكنك أن تفعل مع أشجار التعبير.

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

لذلك أنا أحب هذا النوع من الاشياء, و هذا ما الفوقية البرمجة عن برامج الكتابة في البرامج التي لا برامج.أقول تبقى!

أنا أقدر ما كنت تحاول القيام به مع مكان الإقامة هنا.أنا واجهت هذه المعضلة.إنه لشعور غريب أن يكتب:

DoSomething("MyProperty", new OtherClass());

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

الشيء الآخر قد حاولت تزيين الممتلكات الخاصة بك مع السمات ، ومن ثم تعكس ضد صفك عندما شيدت تبحث عن خصائص السمة و تحميل القواعد.

[DoSomething(typeof(OtherClass), typeof(OtherClass2))]
public int MyProperty
{
  get;
  set;
}

في هذه الحالة منشئ (ربما في قاعدة الفصل؟) سوف حيوي إنشاء OtherClass كائن و OtherClass2 كائن ، تحميلها إلى مجموعة جنبا إلى جنب مع اسم الخاصية.

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