创建从 ToDictionary() 派生的扩展方法

我想创建一个源自ToDictionary(). 目前为了达到预期的结果,我这样做:


ObjectAttributes = model.ObjectAttributes.ToDictionary(

    oa => oa.Attribute.Name, oa => oa.ToWrapper<ObjectAttributeWrapper>());

所以我使用以下ToDictionary签名:


public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(

    this IEnumerable<TSource> source,

    Func<TSource, TKey> keySelector,

    Func<TSource, TElement> elementSelector);

我想知道是否可以这样做?


ObjectAttributes = model.ObjectAttributes.ToDictionaryWrapper<ObjectAttributeWrapper>(

    oa => oa.Attribute.Name);

这是当前的实现,但显然不起作用:


public static Dictionary<TKey, TWrapper> ToDictionaryWrapper<TWrapper, TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) where TSource : BaseModel where TWrapper : IBaseWrapper

{

        return source.ToDictionary(keySelector, model => model.ToWrapper<TWrapper>());

}

编辑:实施ToWrapper():


public static TWrapper ToWrapper<TWrapper>(this BaseModel model) where TWrapper : IBaseWrapper

    {

        if (model == null)

            return default;


        var type = typeof(TWrapper);


        if (_wrapperParents.ContainsKey(type) && _wrapperParents[type].Id == model.Id)

            return (TWrapper)_wrapperParents[type];

        else

            return (TWrapper)GetConstructor<TWrapper>().Invoke(new object[] { model });

    }


    public static IEnumerable<TWrapper> ToListWrapper<TWrapper>(this IEnumerable models) where TWrapper : IBaseWrapper

    {

        var _models = models as IEnumerable<BaseModel>;

        if (_models == null)

            return default;


        return _models.Select(model => model.ToWrapper<TWrapper>());

    }


MYYA
浏览 46回答 1
1回答

呼如林

通常,对于单个通用约束列表,您只能显式提供所有参数或自动解析所有参数。您不能部分提供约束。所以你的选择如下(我假设TWrapper会有一个属性WrappedObject):按原样提供所有参数减少泛型参数的数量(如果密钥类型始终相同,您甚至可以将其设置为非泛型)// signatureDictionary<TKey, TWrapper> ToDictionaryWrapper<TWrapper, TKey>(&nbsp; &nbsp; this IEnumerable<BaseModel> source,&nbsp; &nbsp; Func<BaseModel, TKey> keySelector)&nbsp; &nbsp; where TWrapper : IBaseWrapper;// callmodel.ObjectAttributes&nbsp; &nbsp; .ToDictionaryWrapper<ObjectAttributeWrapper, string>(oa => oa.Attribute.Name);将函数调用分为两部分,一部分是显式的,另一部分是隐式的// signatureIEnumerable<TWrapper> Wrap<TWrapper>(this IEnumerable<BaseModel> source)&nbsp; &nbsp; where TWrapper : IBaseWrapper;Dictionary<TKey, TWrapper> ToDictionaryWrapper<TWrapper, TKey>(&nbsp; &nbsp; this IEnumerable<TWrapper> source,&nbsp; &nbsp; Func<BaseModel, TKey> keySelector)&nbsp; &nbsp; where TWrapper : IBaseWrapper;// callmodel.ObjectAttributes&nbsp; &nbsp; .Wrap<ObjectAttributeWrapper>()&nbsp; &nbsp; .ToDictionaryWrapper(oa => oa.Attribute.Name);不用担心自定义ToDictionaryWrapper,只需使用 Wrap-Function 和 FrameworkToDictionary// call (signature for Wrap same as above)model.ObjectAttributes&nbsp; &nbsp; .Wrap<ObjectAttributeWrapper>()&nbsp; &nbsp; .ToDictionary(w => w.WrappedObject.Attribute.Name);
打开App,查看更多内容
随时随地看视频慕课网APP