C# 与C泛型抗争,这可能吗?
我目前正在设计C.NET核心应用程序。我将使用泛型来继承所有派生类中的一些属性。目标是归档多个可标记实体的多个关系。应用程序的概念很时髦,因为标记将包含作为约束实体的相关逻辑。我对泛型类中正确的where语句存在问题,无法为所有可标记实体使用继承的标记属性 以下是抽象: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
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准备测试溶液并粘贴拉链