如何在C#中创建泛型方法重载?

时间:2016-09-14 10:22:17

标签: c# generics overloading

我有3个功能,它们是同一类型的分支。

public interface k
{
    void CreateOrUpdate(IList<TagInfoForRecommender> tagList, IndexType indexType);
    void CreateOrUpdate(IList<ArtifactInfoForRecommender> artifactList, IndexType indexType);
    void CreateOrUpdate(IList<UserInfoForRecommender> userList, IndexType indexType);
}

我想创建一个泛型类型,其中继承接口的实现类可以编写函数的重载方法。

我试过了

public interface k
{    
    void CreateOrUpdate<T>(IList<T> tagList, IndexType indexType) 
        where T : BaseInfoForRecommender;
}

但它只能在实现的类中创建一个方法。

我想在

中创建重载
public class d : K
{
    CreateOrUpdate<TagInfoForRecommender>(IList<TagInfoForRecommender> tagList, IndexType indexType)
    {
        //impelement sth
    }

    CreateOrUpdate<TagInfoForRecommender>(IList<TagInfoForRecommender> tagList, IndexType indexType)
    {
        //impelement sth
    } 
}

2 个答案:

答案 0 :(得分:4)

您可以使用通用界面

public interface K<T> where T : BaseInfoForRecommender{
  void CreateOrUpdate(IList<T> list, IndexType indexType); 
}

然后为每种类型多次实现接口

public class d : K<TagInfoForRecommender>,
                 K<ArtifactInfoForRecommender>, 
                 K<UserInfoForRecommender> {
  public void CreateOrUpdate(IList<TagInfoForRecommender> list, IndexType indexType) {...}
  public void CreateOrUpdate(IList<ArtifactInfoForRecommender> list, IndexType indexType) {...}
  public void CreateOrUpdate(IList<UserInfoForRecommender> list, IndexType indexType) {...}
}

答案 1 :(得分:1)

你不能这样做。

唯一可以接近你想要达到的目标(如果我理解你的问题)是通过做一些类型检查:

public interface IAbstraction
{
    void CreateOrUpdate<T>(IList<T> tagList, IndexType indexType)
        where T : BaseInfoForRecommender;
}

实现:

public class Concrete : IAbstraction
{
    void CreateOrUpdate<T>(IList<T> tagList, IndexType indexType)
        where T : BaseInfoForRecommender
    {
         var dict = new Dictionary<Type, Action<IList<object>, IndexType>()
         {
             { typeof(TagInfoForRecommender),
                 (tagList, indexType) => CreateOrUpdateTagInfoForRecommender(list.Cast<TagInfoForRecommender>(), index) },

             { typeof(ArtifactInfoForRecommender),
                 (tagList, indexType) => CreateOrUpdateArtifactInfoForRecommender(list.Cast<ArtifactInfoForRecommender>(), index) },

             { typeof(UserInfoForRecommender),
                 (tagList, indexType) => CreateOrUpdateUserInfoForRecommender(list.Cast<UserInfoForRecommender>(), index) },
         };
         dict[typeof(T)](tagList.Cast<object>(), indexType);
    }

    private CreateOrUpdateTagInfoForRecommender(IList<TagInfoForRecommender> tagList, IndexType indexType)
    {
    }

    private CreateOrUpdateArtifactInfoForRecommender(IList<ArtifactInfoForRecommender> tagList, IndexType indexType)
    {
    }

    private CreateOrUpdateUserInfoForRecommender(IList<UserInfoForRecommender> tagList, IndexType indexType)
    {
    }
}

我想你可以写一些更好的东西,因为我没有尝试我的代码(你应该有一些错误)。但你有主要的想法。