У меня есть базовый класс 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);
Есть ли способ упростить общие аргументы?Должен ли я делать что-то совсем другое?