C# 与C泛型抗争,这可能吗?

C# 与C泛型抗争,这可能吗?,c#,generics,.net-core,abstraction,C#,Generics,.net Core,Abstraction,我目前正在设计C.NET核心应用程序。我将使用泛型来继承所有派生类中的一些属性。目标是归档多个可标记实体的多个关系。应用程序的概念很时髦,因为标记将包含作为约束实体的相关逻辑。我对泛型类中正确的where语句存在问题,无法为所有可标记实体使用继承的标记属性 以下是抽象: public interface ITaggable { long TagId { get; set; } Tag Tag { get; set; } } public interface IEntityTag

我目前正在设计C.NET核心应用程序。我将使用泛型来继承所有派生类中的一些属性。目标是归档多个可标记实体的多个关系。应用程序的概念很时髦,因为标记将包含作为约束实体的相关逻辑。我对泛型类中正确的where语句存在问题,无法为所有可标记实体使用继承的标记属性

以下是抽象:

public interface ITaggable
{
    long TagId { get; set; }
    Tag Tag { get; set; }
}

public interface IEntityTag<T> : ITaggable where T : Entity
{
    long EntityId { get; set; }
    T Entity { get; set; }
}

public abstract class TaggableEntity<T> : Entity where T : ITaggable
{
    public ICollection<T> EntityTags { get; set; }
    public List<Tag> Tags { get { return EntityTags.Select(x => x.Tag).ToList(); } }
}

public abstract class ConstraintBase<TSubject, TOwner>
    : ConstraintEntity where TOwner : TaggableEntity<IEntityTag<TOwner>>
{
    protected ConstraintBase(ConstraintId id, string description)
    {
        Id = id.Value();
        Name = id.ToString();
        Description = description;
        IsExecutable = false;
    }

    public IEnumerable<TSubject> Validate(IEnumerable<TSubject> items, TOwner owner)
    {
        return items.Where(x => Validate(x, owner));
    }

    public void Execute()
    {
        if (IsExecutable) { OnExecuting(); }
    }

    protected abstract bool Validate(TSubject item, TOwner owner);
    public abstract void OnExecuting();

}
这里是具体的课程

public class ConstraintEntity : Entity
{
    public string Name { get; set; }
    public string Description { get; set; }
    public bool IsExecutable { get; set; }

    public ConstraintId ConstraintId => (ConstraintId)Id;
}

public class EndWorkConstraint : ConstraintBase<Activity, User>
{
    public EndWorkConstraint() : base(ConstraintId.EndWorkConstraint, "Check if user is allowed to end work")
    {
    }

    protected override bool Validate(Activity item, User owner)
    {
        return item.ActivityId != ActivityId.EndWork;
    }

    public override void OnExecuting()
    {
        throw new System.NotImplementedException();
    }
}

public class User : TaggableEntity<UserTag>
{
    public string Login { get; set; }
    public string Password { get; set; }
}
问题是:我是否能够修改ConstraintBase where语句,使EndWorkConstraint类不会引发错误,并且仍然可以使用显式标记


这是我在论坛上的第一篇帖子,我真的不得不用你的智慧。我很乐意得到任何提示。提前谢谢。

虽然我们可以猜出您的问题是什么,但这需要一些时间。因此,我建议您根据提供的代码创建一个,并指定编译过程中收到的确切错误。推荐阅读-。你是对的,这个问题太费时了。但问题确实很复杂。或者我把事情复杂化了。我会尽量简化它,把重点放在技术问题上,而不是我的问题上。你不需要那么多具有那么多属性的类。最重要的是它应该是完整的,这样任何人都可以复制它并看到相同的错误。如果你告诉我们你得到的错误,这将是很有帮助的。或者可能我在长篇文章中遗漏了什么?错误是类型User mus可以转换为TaggableEntity,以便在泛型类constraintbase int EndWorkConstraint类中使用它作为参数TOwner。我在测试中尝试将用户转换为该类型,但也失败了,但这次编译器说:无法转换类型。。。到通过引用转换,通过内置转换进行装箱转换。我将为scenarion准备测试溶液并粘贴拉链