سؤال

لقد قمت بربط ASP.net GridView بمجموعة من الأنواع المجهولة.

كيف يمكنني الرجوع إلى إحدى خصائص الأنواع المجهولة في معالج الأحداث RowDataBound؟

أنا على دراية بالفعل بطريقة إرسال النوع المجهول مثل هذا:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var AnonObj = Cast(e.Row.DataItem, 
          new { StringProperty = "", BoolProperty = false, IntProperty = 0 });

        if (AnonObj.BoolProperty)
        {
            e.Row.Style.Add(HtmlTextWriterStyle.Color, "Red");
        }
    }
}


T Cast<T>(object obj, T type)
{
    return (T)obj;
}

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

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

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

المحلول

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

نصائح أخرى

والنظر في استخدام التفكير.

مثال:

object o = e.Row.DataItem;
Type t = o.GetType();
PropertyInfo pi = t.GetProperty("StringProperty");
if (pi != null && pi.PropertyType == typeof(string))
{
  // the property exists!
  string s = pi.GetValue(o, null) as string;
  // we have the value
  // insert your code here
  // PROFIT!  :)
}

وتدقيق الأخطاء وتحسين يقم باعتبارها ممارسة للقارئ.

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

ما أقوم به هو ... على سبيل المثال،

string Name = (string)DataBinder.Eval(dataItem.DataItem, "Name");

و... ولكن هذا في معالج الأحداث listview ItemDataBound. الفكر قد يكون من المفيد لشخص ما.

لا، لا أعتقد أن هناك أي طريقة أفضل من هذا. وC # الرجال لا تدعم حقا باستخدام أنواع مجهولة خارج نطاق طريقة المحلي (أي هنا لديك نوع مجهول تعلق على وجوه الصف الخاص بك).

والاقتراح المعتاد سيكون لجعل فئة حقيقية بدلا من ذلك.

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

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