2012-01-12 9 views
0

Iは方法1 MEFa)MEF合成エンジンでa)MEFとGenericsを組み合わせるには?

を以下のプログラムを持っている:ジェネリック等を用い

public ObjectResult<PartnerListingStatement> GetCommissionListingRecords(string uRL, PortalConstant.DataSourceType DataSourceType) 
     { 

      ObjectResult<PartnerListingStatement> lstCommissionPartner = null; 

      var dataPlugin = DataPlugins.FirstOrDefault(i => i.Metadata["SQLMetaData"].ToString() == DataSourceType.EnumToString()); 

      if (dataPlugin != null) 
      { 
       lstCommissionPartner = dataPlugin.Value.GetCommissionListingRecords(uRL); 
      } 
      return lstCommissionPartner; 
     } 

方法B

public ObjectResult<CommissionEarned> GetCommissionPaidToPartners(string uRL, PortalConstant.DataSourceType DataSourceType) 
     { 
      ObjectResult<CommissionEarned> lstCommissionEarned = null; 

      var dataPlugin = DataPlugins.FirstOrDefault(i => i.Metadata["SQLMetaData"].ToString() == DataSourceType.EnumToString()); 

      if (dataPlugin != null) 
      { 
       lstCommissionEarned = dataPlugin.Value.GetCommissionPaidToPartners(uRL); 
      } 
      return lstCommissionEarned; 
     } 

これら二つを組み合わせることができます。また、データ型も異なります。 N.B.〜この質問はGenerics program to access WCF service from client

おかげ

答えて

2

尋ねた後尋ねる最初の質問とは異なっている「私はこれらの方法を組み合わせることはできますか?」 「これらの方法に共通しているのは何ですか?」

***SomeType******SomeMethod***は、メソッドの間に2つの意味の違いがあり
public ObjectResult<***SomeType***> GetValues(string uRL, PortalConstant.DataSourceType DataSourceType) 
{ 
    ObjectResult<***SomeType***> ret = null; 

    var dataPlugin = DataPlugins.FirstOrDefault(i => i.Metadata["SQLMetaData"].ToString() == DataSourceType.EnumToString()); 

    if (dataPlugin != null) 
    { 
     ret = dataPlugin.Value.***SomeMethod***(uRL); 
    } 
    return ret; 
} 

:Iあなたの場合、その答えは、このようなものになるだろう。タイプを扱う場合は、メソッドを汎用的にして、***SomeType***のすべてを汎用パラメータに置き換えます。メソッドを処理するには、デリゲートパラメーターをメソッドに追加します。その使用法に基づいて、代理人はFunc<PluginType, string, ObjectResult<***SomeType***>>タイプのものとなり、PluginTypeはどんなタイプのものでもdataPlugin.Valueです。今、あなたは持っている:

public ObjectResult<T> GetValues<T>(//do come up with a better name 
    string uRL, 
    PortalConstant.DataSourceType DataSourceType, 
    Func<PluginType, string, ObjectResult<T>> resultSelector) 
{ 
    ObjectResult<T> ret = null; 

    var dataPlugin = DataPlugins.FirstOrDefault(i => i.Metadata["SQLMetaData"].ToString() == DataSourceType.EnumToString()); 

    if (dataPlugin != null) 
    { 
     ret = resultSelector(dataPlugin.Value, uRL); 
    } 
    return ret; 
} 

他の方法について

GetValues(uRL, DataSourceType, (p, u) => p.GetCommissionListingRecords(u)); 

と同様に(ジェネリック型を推測しなければならない)に変更さGetCommissionListingRecordsです。

+0

データパルギンは[ImportMany] です。public System.Lazy > [] DataPlugins {get;セット; } – user1025901

+0

その場合、PluginTypeには何が入りますか? – user1025901

+0

私はそれを解決..私はインターフェイスを渡す必要があります。 – user1025901

関連する問題