문제

이전에는 ASMX 웹 서비스와 .aspx 페이지(웹 클라이언트) 간에 유형 정의를 공유하려고 할 때 문제가 발생했습니다.

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 3.5를 사용하는 경우 WCF를 사용할 수 있습니다. 이는 프록시를 생성하기 위해 사용해야하는 것입니다. trimbrokerasmxproxy.asmxproxy.asmxproxy.metadata 유형을 DataContract 속성과 Datamember 속성으로 직렬화되는 멤버와 함께 귀속시킬 수 있습니다. 그런 다음 실제 유형으로 계약을 정의 할 수 있으며 전환을 수행 할 필요가 없습니다.

Array.ConvertAll을 사용할 수도 있습니다. 나는 당신이 이것에 비교적 새로운 것을 알고 있으므로 설명해 보겠습니다. 2 개의 일반 매개 변수가 있습니다. 첫 번째는 변환하려는 배열의 유형입니다 (i라고 부르겠습니다). 두 번째는 변환하려는 유형입니다 (O라고 부르십시오). 유형 I 배열을 허용하고 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