2012-03-07 23 views
1

ジェネリッククラスのrefをパラメータとして使用してデータを変更する方法ここに私のサンプルコードがありますジェネリックの参照オブジェクトc#

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

    return false; 
} 

私はobjの中のデータを更新したいと思います。

+0

コードは問題ありません。どうしたの? – Candide

+0

あなたの例で「T」とは何ですか?それはOrderMessageSalesOrderですか? –

+0

Tは一般的なパラメータです –

答えて

0

あなたはその後、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; 
} 

であることを確認することができます一般的なメソッドであれば、どの型もobjに渡すことができますが、メソッドは非常に特殊な型(OrderMessageSalesOrder)を作成しているように見えます。なぜこれを最初にジェネリックにする必要があるのか​​再考したいかもしれません。

0

Refは型付き値によく使われます。 objパラメータが参照型(objという名前なので)の場合、refキーワードを追加する必要はありません。 objの値を変更するには、その型を与える必要があります。一つの方法は次のように、型変換を使用することです:

MyTyped myObj = (MyTyped)obj; 

そして(それは参照だから)もOBJの値を変更しますこのmyobjの値を設定します。あなたがいるので、構造体の代わりにクラスを扱っている場合は、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が受注コードプロパティを定義すると仮定すると、とOrderMessageSalesOrderは、IDプロパティ(またはフィールド)を提供します。

refは、新しい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; 
} 

が、その後、私はあなたを考えます不安定な地面にいる。

関連する問題