获取泛型上下文中的类的类型

时间:2017-12-11 16:04:52

标签: c# .net-core

我正在使用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行代码。

1 个答案:

答案 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