Упростите дженерики в интерфейсе - PullRequest
1 голос
/ 26 сентября 2019

У меня есть базовый класс Entity и два интерфейса, IParent и IChild:

public abstract class Entity<TId> : IEquatable<Entity<TId>>
{
    public TId Id { get; set; }
}

public interface IParent<TParent, TParentId, TChild, TChildId>
    where TChild : Entity<TChildId>, IChild<TChild, TChildId, TParent, TParentId>
    where TParent : Entity<TParentId>, IParent<TParent, TParentId, TChild, TChildId>
{
    ICollection<TChild> Children { get; set; }
}

public interface IChild<TChild, TChildId, TParent, TParentId> 
    where TParent : Entity<TParentId>, IParent<TParent, TParentId, TChild, TChildId>
    where TChild : Entity<TChildId>, IChild<TChild, TChildId, TParent, TParentId>
{
    TParent Parent { get; set; }

    TParentId ParentId { get; set; }
}

Я хочу использовать их в методе AddChildren, например:

public partial class Helpers
{
    public static void AddChildren<TParent, TParentId, TChild, TChildId>(
        IDictionary<TParentId, TParent> parents,
        IList<TChild> children)
        where TParent : Entity<TParentId>, IParent<TParent, TParentId, TChild, TChildId>
        where TChild : Entity<TChildId>, IChild<TChild, TChildId, TParent, TParentId>
    {
        foreach (var child in children)
        {
            parents[child.ParentId].Children.Add(child);
        }
    }

    public static void AddChildren<T1, T1Id, T2, T2Id, T3, T3Id>(
        IDictionary<T1Id, T1> t1,
        IDictionary<T2Id, T2> t2,
        IList<T3> t3)
        where T1 : Entity<T1Id>, IParent<T1, T1Id, T2, T2Id>
        where T2 : Entity<T2Id>, IChild<T2, T2Id, T1, T1Id>, IParent<T2, T2Id, T3, T3Id>
        where T3: Entity<T3Id>, IChild<T3, T3Id, T2, T2Id>
    {
        AddChildren<T2, T2Id, T3, T3Id>(t2, t3);
        AddChildren<T1, T1Id, T2, T2Id>(t1, t2.Values.ToList());
    }
}

Меня не особенно радует необходимость указывать все параметры типа всякий раз, когда я реализую интерфейсы и вызываю методы.Простые классы выглядят так:

public class MyGuidParentEntity : Entity<System.Guid>, IParent<MyGuidParentEntity, System.Guid, MyLongChildEntity, long>
{
    public ICollection<MyLongChildEntity> Children { get; set; }
}

public class MyLongChildEntity : Long.Entity, IChild<MyLongChildEntity, long, MyGuidParentEntity, System.Guid>
{
    public MyGuidParentEntity Parent { get; set; }

    public System.Guid ParentId { get; set; }
}

Простые вызовы методов выглядят так:

Helpers.AddChildren<MyGuidParentEntity, System.Guid, MyLongChildEntity, long>(parents, children);

Есть ли способ упростить общие аргументы?Должен ли я делать что-то совсем другое?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...