نسخة مجموعة من الكائنات إلى مجموعة من نوع مختلف

StackOverflow https://stackoverflow.com/questions/679031

  •  21-08-2019
  •  | 
  •  

سؤال

وسابقا، أنا واجهت مشكلة أثناء محاولة مشاركة تعريف نوع بين قائمتي خدمة ويب ASMX وصفحة .aspx بلدي (webclient)

الخلط على C # صفيف من الكائنات ونوع الضمني تحويل

وكما أفهم النصيحة، "مشكلة" هذا يخلق يمكن حلها عن طريق نسخ مجموعة من الكائنات التي تم إنشاؤها في عميل إلى مجموعة جديدة من الكائنات كما هو محدد من قبل فئة وكيل ASMX.

ويجري الصاعد في C # أنا لا تزال تكافح مع هذه المهمة بسيطة. وفيما يلي المزيد من أجزاء من قانون بلدي (لا تزال شظايا أخرى في الوظيفة السابقة دون تغيير):

... هنا حيث أنا ملء "بيانات الاختبار" أريد لتمريرها إلى خدمة ويب:

// create an array of MetaData objects
MetaData[] nvPairs = new MetaData[20];   // arbitrary length of 20 pairs

// create arbitrary MetaData objects in the array
nvPairs[0] = new MetaData("Grant Number", "2577-9912");
nvPairs[1] = new MetaData("OPEAnalyst", "Simpson");

... هنا أحاول وظيفة ل"نسخة" من نوع "الحقيقي" المعرفة في بلدي TRIMBrokerUtil مساحة (التي لا يمكنني استخدام تماما بسبب الوكيل) إلى إصدار وكيل من هذا النوع:

protected TRIMBrokerASMXProxy.ASMXProxy.MetaData[] CopyMetaData(
    MetaData utilArray)
{
    TRIMBrokerASMXProxy.ASMXProxy.MetaData[] outArray = 
        new TRIMBrokerASMXProxy.ASMXProxy.MetaData[utilArray.Name.Length];
    int i;
    for (i = 0; i < utilArray.Name.Length; i++)
    {
        outArray[i].Name = utilArray.Name;
        outArray[i].Value = utilArray.Value;
    }
    return outArray;
}

... ثم هنا هو المكان الذي أنا أحاول أن ندعو إلى أن وظيفة (الأعلام المترجم 2 أخطاء على هذا الخط:

TRIMBrokerASMXProxy.ASMXProxy.MetaData[] kvData = 
    CopyMetaData(metaDataArray); 

وكل من أخطاء الترجمة أدناه أشر إلى نفس السطر:

والخطأ 1 المباراة طريقة أفضل طاقتها ل"_Default.CopyMetaData (TRIMBrokerUtil.MetaData)" لديه بعض الحجج الباطلة

والخطأ 2 حجة '1': لا يمكن تحويل من 'TRIMBrokerUtil.MetaData []' إلى 'TRIMBrokerUtil.MetaData'

وأنا إغلاق؟

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

المحلول

ولقد أعلن المعلمة ليتم MetaData بدلا من MetaData[] - وبعبارة أخرى أنها ليست صفيف. كنت ثم استخدام utilArray.Name بدلا الكثير، ولكن ليس من الواضح لماذا.

وأظن كنت فعلا تريد:

protected TRIMBrokerASMXProxy.ASMXProxy.MetaData[]
    CopyMetaData(MetaData[] utilArray)
{
    TRIMBrokerASMXProxy.ASMXProxy.MetaData[] outArray = 
        new TRIMBrokerASMXProxy.ASMXProxy.MetaData[utilArray.Length];
    for (int i = 0; i < utilArray.Length; i++)
    {
        outArray[i] = new TRIMBrokerASMXProxy.ASMXProxy.MetaData();
        outArray[i].Name = utilArray[i].Name;
        outArray[i].Value = utilArray[i].Value;
    }
    return outArray;
}

وبالمناسبة، قد ترغب في النظر في التوجيه using لجعل هذا أسهل للقراءة:

using ProxyMetaData = TRIMBrokerASMXProxy.ASMXProxy.MetaData;

...

protected ProxyMetaData[] CopyMetaData(MetaData[] utilArray)
{
    ProxyMetaData[] outArray = new ProxyMetaData[utilArray.Length];
    for (int i = 0; i < utilArray.Length; i++)
    {
        outArray[i] = new ProxyMetaData();
        outArray[i].Name = utilArray[i].Name;
        outArray[i].Value = utilArray[i].Value;
    }
    return outArray;
}

وثمة بديل آخر هو Array.ConvertAll:

ProxyMetaData[] output = Array.ConvertAll(input,
    metaData => new ProxyMetaData(metaData.Name, metaData.Value));

إذا كنت لا تستخدم C # 3 يمكنك استخدام أسلوب المجهول لذلك. إذا لم ProxyMetaData لها منشئ المناسب ولكم <م> هي باستخدام C # 3، يمكنك استخدام مهيئ الكائن:

ProxyMetaData[] output = Array.ConvertAll(input,
    metaData => new ProxyMetaData { metaData.Name, metaData.Value });

إذا كنت عالقا مع C # 2 وليس منشئ المناسب، ثم:

ProxyMetaData[] output = Array.ConvertAll(input, delegate(MetaData metaData)
{
    ProxyMetaData proxy = new ProxyMetaData();
    proxy.Name = metaData.Name;
    proxy.Value = metaData.Value;
});

أنا <م> التفكير التي غطت جميع القواعد:)

نصائح أخرى

وأود أن مجرد استخدام LINQ للقيام بذلك:

TRIMBrokerASMXProxy.ASMXProxy.MetaData[] kvData =
    metaDataArray.Select(d => 
        new TRIMBrokerASMXProxy.ASMXProxy.MetaData(
            d.Name, d.Value)).ToArray();

وبالإضافة إلى ذلك، إذا كنت تستخدم .NET Framework 3.5، فهذا يعني أنك يمكن استخدام WCF كذلك، وهو ما يجب أن تستخدم لتوليد الوكيل. هل سيكون قادرا على السمة نوع TRIMBrokerASMXProxy.ASMXProxy.MetaData مع السمة DataContract وأعضاء يتم تسلسل مع السمة DataMember. ثم، هل سيكون قادرا على تحديد عقدك مع نوع الفعلي، وليس من الضروري تنفيذ تحويل على الإطلاق.

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

delegate O Converter(I input);

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

using ProxyMetaData = TRIMBrokerASMXProxy.ASMXProxy.MetaData;

ProxyMetaData[] convertedArray = Array.ConvertAll<MetaData, ProxyMetaData>(utilArray, 
delegate(MetaData metaData)
{
    ProxyMetaData returnValue = new ProxyMetaData();
    returnValue.Name = metaData.Name;
    returnValue.Value = metaData.Value;
    return returnValue;
});
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top