سؤال

لدي التسلسل الهرمي للصف التالي:

public class Row : ICloneable, IComparable, IEquatable<Row>,
    IStringIndexable, IDictionary<string, string>,
    ICollection<KeyValuePair<string, string>>,
    IEnumerable<KeyValuePair<string, string>>,
    System.Collections.IEnumerable
{ }

public class SpecificRow : Row, IXmlSerializable,
    System.Collections.IEnumerable
{
    public void Add(KeyValuePair<MyEnum, string> item) { }
}

ومع ذلك ، فإن محاولة القيام بما يلي تعطي خطأ:

var result = new SpecificRow
    {
        {MyEnum.Value, ""},
        {MyEnum.OtherValue, ""}
    };

أحصل على هذا الخطأ:

أفضل طريقة إضافة "row.add (سلسلة ، سلسلة)

كيف يمكنني صنعه بحيث استخدام كائن تهيئة على الفئة المشتقة SpecificRow يسمح النوع MyEnum؟ يبدو أنه يجب أن يرى Add الطريقة في SpecificRow.

تحديث: لقد قمت بتطبيق واجهة إضافية على SpecificRow لذلك يبدو الآن هكذا:

public class SpecificRow : Row, IXmlSerializable,
    System.Collections.IEnumerable,
    ICollection<KeyValuePair<MyEnum, string>>
{ }

ومع ذلك ، ما زلت أحصل على نفس Add خطأ. سأحاول التنفيذ IDictionary<MyEnum, string> التالي.

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

المحلول

لا ينظر مصادفة التجميع بالضرورة إلى أي طريقة icollection.add (x). بشكل أكثر تحديدا ، لمهياج التجميع

new SpecificRow {
    { ? }
}

C# ينظر إلى أي طريقة إضافة مع إضافة توقيع (؟) ؛ إذا ؟ يحتوي على فاصلة ، C# ينظر إلى طريقة إضافة مع حجج متعددة. ليس لدى المترجم أي معالجة خاصة لـ KeyValuepair <،> على الإطلاق. السبب { string, string } يعمل ، لأن الفصل الأساسي الخاص بك يحتوي على تحميل زائد Add(string, string), ، و ليس لأنه يحتوي على زائد ل Add(KeyValuePair<string, string>).

لدعم بناء الجملة الخاص بك ل

new SpecificRow {
    { MyEnum.Value, "" }
};

تحتاج إلى حمولة زائدة من النموذج

void Add(MyEnum key, string value)

هذا كل ما في الامر.

نصائح أخرى

يبدو أنه لأنك تنفذ فقط IDictionary<string, string>, ، وجميع الواجهات الأخرى المرتبطة به. لك Add(KeyValuePair<MyEnum, string>) الطريقة لا تنفذ أي عضو في الواجهة ، إنها مجرد عضو آخر في SpecificRow فئة ، التي يحدث الكشف عن هويته Add, ، ولهذا السبب يتم تجاهله.

يجب أن تكون قادرًا على القيام بواحد مما يلي ، اعتمادًا على متطلباتك:

  1. ينفذ IDictionary<MyEnum, string> بالإضافة إلى IDictionary<MyEnum, string>, ، بما في ذلك الواجهات التابعة (ICollection<KeyValuePair<MyEnum, string>>, ، إلخ).
  2. ينفذ IDictionary<MyEnum, string> بدلاً من IDictionary<MyEnum, string>, ، مرة أخرى بما في ذلك الواجهات التابعة.
  3. تغيير إعلان Row إلى Row<T>, وتنفيذ IDictionary<T, string>, ، بما في ذلك الواجهات التابعة. SpecificRow ثم تنفذ Row<MyEnum> بدلا من مجرد Row.

إجابة روبن هي بالتأكيد الأفضل ، ولكن إذا لم تكن ترغب في إضافة Add(MyEnum key, string value) ثم يمكنك أيضًا تهيئة المجموعة مثل SO:

var result = new SpecificRow
{
    new KeyValuePair<MyEnum, string>(MyEnum.Value, ""}),
    new KeyValuePair<MyEnum, string>(MyEnum.OtherValue, ""})
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top