c# - 泛型:如何检查 T 的确切类型,没有 T 的对象

标签 c# generics

如果没有 T 的对象,我如何检查/评估 T 的确切类型。我知道我的问题可能令人困惑,但考虑一下......

 public abstract class Business
    {
        public abstract string GetBusinessName();
    }

    public class Casino : Business  
    {
        public override string GetBusinessName()
        {
            return "Casino Corp";
        }
    }

    public class DrugStore : Business 
    {
        public override string GetBusinessName()
        {
            return "DrugStore business";
        }
    }


    public class BusinessManager<T> where T : Business
    {
        private Casino _casino;
        private DrugStore _drugStore;

        public string ShowBusinessName()
        {
            string businessName;
            if (T == Casino) // Error: How can I check the type?
            {
                _casino = new Casino();
                businessName = _casino.GetBusinessName();
            }
            else if (T == DrugStore) // Error: How can I check the type?
            {
                _drugStore = new DrugStore();
                businessName = _drugStore.GetBusinessName();
            }

            return businessName;

        }
    }

我只想在客户端有这样的东西。

    protected void Page_Load(object sender, EventArgs e)
    {
        var businessManager = new BusinessManager<Casino>();
        Response.Write(businessManager.ShowBusinessName());

        businessManager = new BusinessManager<DrugStore>();
        Response.Write(businessManager.ShowBusinessName());
    }

请注意,当我调用 BusinessManager 时,我实际上并没有为 Casino 和 Drugstore 创建实际对象,我只是将它作为类的通用类型约束传递。我只需要确切地知道我传递给 BusinessManager 的是什么类型,就可以知道要实例化的确切类型是什么。谢谢...

PS:我不想为赌场和药店创建单独的特定 BusinessManager..

您也可以对设计发表评论..谢谢..

附加:如果类 Casino 和 DrugStore 是一个抽象类 =)

最佳答案

你可以写

if(typeof(T) == typeof(Casino))

但实际上这种逻辑是一种代码味道。

这是解决这个问题的一种方法:

public class BusinessManager<T> where T : Business, new() {
    private readonly T business;
    public BusinessManager() {
        business = new T();
    }
}

但我个人更喜欢

public class BusinessManager<T> where T : Business {
    private readonly T business;
    public BusinessManager(T business) {
        this.business = business;
    }

    public string GetBusinessName() { 
        return this.business.GetBusinessName();
    }
}

关于c# - 泛型:如何检查 T 的确切类型,没有 T 的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4064322/

相关文章:

c# - 从 3 个通用类型中推断出 2 个

swift - 什么是占位符?为什么我们需要为泛型定义占位符数据类型?

java - 了解 Java 中的列表列表

c# - 如何在 C# 中通过表达式构建动态查询

c# - 如何加快从 C# 创建 excel Excel 电子表格的速度?

c# - 是否可以将通用参数类型限制为此?

c# - 在 C# 中可以使用什么替代方法来避免方法返回 `object` 类型?

c# - 多个数据库更新:

c# - 压缩和utf8编码

c# - 移动位图区域