.NET Fiddle

CSharp · Console

/Program.cs

using System;
using System.Collections.Generic;

public class BaseEntity { }
public class ChildAEntity : BaseEntity { }
public class GrandChildAEntity : ChildAEntity { }
public class ChildBEntity : BaseEntity { }

public interface IEntityPolicy<out T>
{
    string GetPolicyResult(BaseEntity entity);
}

public class BaseEntityPolicy : IEntityPolicy<BaseEntity>
{
	public BaseEntityPolicy()  {}
    public string GetPolicyResult(BaseEntity entity) { return nameof(BaseEntityPolicy); }
}
public class GrandChildAEntityPolicy : IEntityPolicy<GrandChildAEntity>
{
    public string GetPolicyResult(BaseEntity entity) { return nameof(GrandChildAEntityPolicy); }
}
public class ChildBEntityPolicy: IEntityPolicy<ChildBEntity>
{
    public string GetPolicyResult(BaseEntity entity) { return nameof(ChildBEntityPolicy); }
}

public class Program
{
	public static void Main()
	{
		var policies = new List<IEntityPolicy<BaseEntity>>();
		
		policies.Add(new BaseEntityPolicy());
		policies.Add(new GrandChildAEntityPolicy());
	}
}
;