2012-03-07 4 views
1

어떻게 generic 클래스의 ref를 매개 변수로 사용하고 데이터를 변경할 수 있습니까? 여기 내 예제 코드제네릭의 참조 객체 C#

내가 OBJ 내부 데이터를 업데이트 할
bool IRequestHandler.ParseRequest<T>(string request, ref T obj) 
{ 
    var req = RequestHandlerGateway.DeserializeFromXml<OrderMessageSalesOrder>(request, "SalesOrder"); 

    return false; 
} 

입니다.

당신은 객체로 직렬화의 결과를 캐스팅 한 후 T에 캐스팅,하지만 당신은 당신의 DeserializeFromXML 방법에서 점점 객체가이이기 때문에 형 T

bool IRequestHandler.ParseRequest<T>(string request, ref T obj) 
{ 
    var req = RequestHandlerGateway.DeserializeFromXml<OrderMessageSalesOrder>(request, "SalesOrder"); 

    obj = (T)(object)(req); // Careful here 

    return false; 
} 

의 있는지 확인 할 수

+0

코드가 정상입니다. 뭐가 문제 야? – Candide

+0

예제에서 "T"는 무엇입니까? OrderMessageSalesOrder입니까? –

+0

T는 일반적인 매개 변수입니다. –

답변

0

제네릭 메서드 인 경우 obj에 대해 모든 형식을 전달할 수 있지만 매우 구체적인 형식 (OrderMessageSalesOrder)을 만드는 것처럼 보이게됩니다. 왜 처음에 제네릭이 필요한지 다시 생각해 볼 수 있습니다.

0

Ref는 주로 입력 값으로 사용됩니다. obj 매개 변수가 참조 유형 인 경우 ("obj"라는 이름을 사용했기 때문에) ref 키워드를 추가 할 필요가 없습니다. obj의 값을 변경하려면 해당 값을 입력해야합니다. 한 가지 방법은 다음과 같이 유형 변환을 사용하는 것입니다.

MyTyped myObj = (MyTyped)obj; 

값을 설정하면 myObj에 대한 값도 obj에 대한 값으로 변경됩니다 (참조이기 때문에). 이 때문에 구조체 대신 클래스를 처리하는 경우가 ref 키워드를 사용할 필요가 없습니다

bool IRequestHandler.ParseRequest<BaseClass>(string request, BaseClass obj) 
0

: 당신은 단순히 코드를 변경, OBJ에 대한 기본 클래스/인터페이스를 찾을 수 있다면 또한

그들은 항상 참고로 전달됩니다. 대신 out 키워드를 사용하는 것이 좋지만 몇 가지 변경 사항을 통해 개선 될 수 있습니다. 다음과 같이 다음을 호출 할 수 있습니다

bool IRequestHandler.ParseRequest<T>(string request, out T obj) 
{ 
    try 
    { 
     var req = RequestHandlerGateway.DeserializeFromXml<T>(request, "SalesOrder"); 
     obj = req; 
     return true; 
    } 
    catch 
    { 
     obj = default(T); 
     return false; 
    } 
} 

그 방법 : 많은이 아니다

OrderMessageSalesOrder salesOrder; 

if(handler.ParseRequest(request, out salesOrder)) 
{ 
    // parsed successfully, salesOrder will be an instance populated with the data in the request. 
} 
else 
{ 
    // unable to parse, salesOrder will be null. 
} 
1

당신이 컴파일러에 알려하지 않는 한 "T obj가"가 지원하는 어떤 추가 인터페이스 할 수 있습니다.

예.

IRequestHandler.ParseRequest<T>(string request, T obj) 
where T : IOrderInfo 
{ 
    var req = RequestHandlerGateway.DeserializeFromXml<OrderMessageSalesOrder>(request, "SalesOrder"); 
    obj.OrderId = req.Id; 
    return true; 
} 

IOrderInfo가 ORDERID 속성을 정의 가정하고 OrderMessageSalesOrder는 ID 속성 (또는 필드)를 제공한다.

새 T 인스턴스를 생성하려는 경우 심판은 필요

: 다음 obj와 역 직렬화 객체 REQ를 캐스팅하려는 경우

IRequestHandler.ParseRequest<T>(string request, ref T obj) 
where T : IOrderInfo, new() 
{ 
    var req = RequestHandlerGateway.DeserializeFromXml<OrderMessageSalesOrder>(request, "SalesOrder"); 
    obj = new T(); 
    obj.OrderId = req.Id; 
    return true; 
} 

것은, 위의 답변이 충분해야한다,하지만 난 당신을 생각 흔들리는 땅에.