سؤال

تبحث عن طريقة لتمرير مصفوفة ترابطية إلى طريقة ما.أنا أتطلع إلى إعادة كتابة حزمة توين Actionscript في C# ولكنني أواجه مشكلة مع المصفوفات/الكائنات "الارتباطية".عادةً في Actionscript قد أفعل شيئًا مثل:

public function tween(obj:DisplayObject, params:Object = null):void {
    if (params.ease != null) {
        //do something
    }
    //...
}

ويمكن أن يسمى هذا مثل:

tween(this, {ease:'out', duration:15});

أنا أبحث عن طريقة لفعل الشيء نفسه في C#.لقد جمعت حتى الآن خياراتي لتكون:

أ) إنشاء فئة أو بنية لتحديد المفاتيح والأنواع المحتملة وتمريرها

ب) تمرير المعلمات كنوع عام

tween(frameworkElement, new {ease = 'out', duration = 15});

على افتراض

public static void tween(FrameworkElement target, object parameters);

واكتشف طريقة ما لاستخدام ذلك في وظيفة توين (لست متأكدًا من كيفية فصل المفتاح = القيمة المعطاة لهذا الكائن.أيه أفكار؟)

ج) إنشاء أ Dictionary<string, object> لتمرير المعلمات إلى وظيفة توين

أي أفكار أخرى أو نموذج التعليمات البرمجية؟أنا جديد على C#.

يحرر

استغرق مني كل يوم لمعرفة هذا:

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

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

المحلول

يحرر:هذه هي الآلية التي تستخدمها ملحقات HtmlHelper في ASP.NET MVC.انها ليست أصلية معي.


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

public static void tween( FrameworkElement target, object parameters )
{
    return tween( target, new ParameterDictionary( parameters ) );
}

public static void tween( FrameworkElement target,
                          ParameterDictionary values )
{
    if (values.ContainsKey( "ease" ))
    {
      ....
    }
}

ثم لديك فئة ParameterDictionary التي تستخدم الانعكاس على النوع المجهول وتقوم بإعداد القاموس.

public class ParameterDictionary : Dictionary<string,object>
{
    public ParameterDictionary( object parameters )
    {
         if (parameters != null)
         {
             foreach (PropertyInfo info in parameters.GetType()
                                                     .GetProperties())
             {
                 object value = info.GetValue(parameters,null);
                 this.Add(info.Name,value);
             }
         }
    }
}

يمنحك هذا سهولة الاستخدام وسهولة الاستهلاك - يتم تغليف عناصر الانعكاس "القبيحة" في مُنشئ واحد للقاموس بدلاً من طريقتك.وبالطبع، يمكن استخدام القاموس مرارًا وتكرارًا لأغراض مماثلة مع كتابة رمز الانعكاس مرة واحدة فقط.

نصائح أخرى

القاموس هو نهج معقول.قد يبدو مثل هذا:

public static void tween(FrameworkElement target, IDictionary<string, object> parameters)
{
    if (parameters.ContainsKey("ease")) {
        //do something
    }
}

ضع في اعتبارك أنه عند تمرير القيم، يمكنك استخدام صيغة تهيئة المجموعة المختصرة لتسهيل الأمر، مثل:

tween(something, new Dictionary<string, object> { { "ease", "out" }, { duration, 15 } });

قد تكون هذه طريقة سريعة جدًا للقيام "بنفس الشيء" تقريبًا مثل كود ActionScript، ولكنها ليست لغة C# رائعة حقًا.تتمثل طريقة C#-ish للقيام بذلك في إنشاء بنية أو فئة TweenParameters حقيقية بخصائص لكل معلمة محتملة، ثم إنشاء واحدة لتمريرها إلى tween().يعتبر هذا بشكل عام أكثر قابلية للصيانة، نظرًا لأن جميع الخصائص "المتاحة" تكون واضحة للمتصل دون النظر إلى الأجزاء الداخلية لـ tween()، ولأنها تكتشف الأخطاء في وقت الترجمة التي لن تلاحظها مقارنة السلسلة حتى وقت التشغيل، مثل كتابة "المدة" "دوراتوين".

أنا شخصياً معجب بالخيار (ب) - تمرير نوع مجهول وتحليل القيم باستخدام الانعكاس.

لقد رأيت آخرين يحققون نفس الشيء باستخدام تعبيرات لامدا.سيكون بناء جملة الاستدعاء:

tween(frameworkElement, ease => "out", duration => 15);

وسيكون الإعلان شيئًا على غرار:

public static void tween(FrameworkElement target, params Expression<Func<object>>[] parameters) { ... }

الفكرة هي أنه يمكنك أخذ عدد متغير من "الوظائف التي ترجع الكائن".ثم تقوم بتحليل اسم المعلمة من كل منها التعبير <TDelegate>, واستدعاء كل واحد للحصول على قيمته.

لا أعتقد أن هذا أفضل من التفكير في شخص مجهول، لكنه نهج آخر يجب أخذه بعين الاعتبار.

تحديث

لقد كتبت بالفعل عن فكرة تمرير المصفوفات الترابطية كقواميس على مدونتي، هنا و هنا.

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