C# تهيئة الكائن الرغبة في استخدام طريقة إضافة خاطئة
-
24-09-2019 - |
سؤال
لدي التسلسل الهرمي للصف التالي:
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
, ، ولهذا السبب يتم تجاهله.
يجب أن تكون قادرًا على القيام بواحد مما يلي ، اعتمادًا على متطلباتك:
- ينفذ
IDictionary<MyEnum, string>
بالإضافة إلىIDictionary<MyEnum, string>
, ، بما في ذلك الواجهات التابعة (ICollection<KeyValuePair<MyEnum, string>>
, ، إلخ). - ينفذ
IDictionary<MyEnum, string>
بدلاً منIDictionary<MyEnum, string>
, ، مرة أخرى بما في ذلك الواجهات التابعة. - تغيير إعلان
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, ""})
};