我正在使用ASP-NET Core 2.0中的通用存储库和业务对象构建一个小应用程序框架。
public interface IEntity
{
int Id { get; set; }
}
public class Person : IEntity
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Repository<TEntity> where TEntity : IEntity
{
public Repository()
{
var myClass = typeof(TEntity);
var myClassName = myClass.Name; // I would expect "Person" - but it says "IEntity" - what am I doing wrong?
}
}
public abstract class BusinessBase<TEntity> where TEntity : IEntity
{
private Repository<IEntity> _repository { get; set; }
public BusinessBase()
{
var myClass = typeof(TEntity);
var myClassName = myClass.Name; // "Person" as expected
this._repository = new Repository<IEntity>();
}
}
public class BusinessPerson : BusinessBase<Person>
{
}
输入此代码,例如在控制台应用程序中,然后调用
var x = new BusinessPerson();
您会注意到我正在尝试在&#34;存储库&#34;中读取通用TEntity的名称。类。我无法弄清楚为什么它没有说'#34;人&#34;。有什么想法或帮助吗?
请不要在这里讨论我的方法的一般设计。我的真实程序看起来不同,但我尽可能简化它,所以你们不需要阅读100行代码。
答案 0 :(得分:1)
由于您声明_repository,您遇到的问题正在发生。您将类型定义为IEntity,而不是协变。简单的解决方案是将_repository的定义更改为以下内容。
public abstract class BusinessBase<TEntity> where TEntity : IEntity
{
private Repository<TEntity> _repository { get; set; }
public BusinessBase()
{
var myClass = typeof(TEntity);
var myClassName = myClass.Name; // "Person" as expected
this._repository = new Repository<TEntity>();
}
}
如果您需要_repository成为IEntity,则会涉及更多更改。研究协方差https://stackoverflow.com/search?q=covariance