如何在MEF合成引擎中结合a)MEF和Generics?

时间:2012-01-12 08:07:32

标签: c# generics mef

我在MEF中有以下程序

方法1:

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

不同

由于

1 个答案:

答案 0 :(得分: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;
}

其中***SomeType******SomeMethod***是方法之间的两个有意义的差异。处理类型,使方法通用,并用泛型参数替换所有***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;
}

将GetCommissionListingRecords更改为(应推断泛型类型)

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

和其他方法类似。