在C#中编写泛型以返回数据类型

在C#中编写泛型以返回数据类型,c#,generics,casting,C#,Generics,Casting,需要一些关于编写C#泛型以从SQL数据库返回数据类型的指导。我正在从数据库中读取数据,以从“SetKey”中获取数据类型。我可以将它们作为字符串返回,但我希望将它们转换为int,在下面的这个特定示例中。这就是我目前所拥有的。我在下面的评论中遇到了几个错误。我在这方面是个新手,所以任何意见或建议都将不胜感激。谢谢大家! 您不能在接口定义中将t保持打开状态。您必须像这样关闭类型 DataTypeModel<SomeType> GetDataType(string str); DataT

需要一些关于编写C#泛型以从SQL数据库返回数据类型的指导。我正在从数据库中读取数据,以从“SetKey”中获取数据类型。我可以将它们作为字符串返回,但我希望将它们转换为int,在下面的这个特定示例中。这就是我目前所拥有的。我在下面的评论中遇到了几个错误。我在这方面是个新手,所以任何意见或建议都将不胜感激。谢谢大家!

您不能在接口定义中将
t
保持打开状态。您必须像这样关闭类型

DataTypeModel<SomeType> GetDataType(string str);
DataTypeModel-GetDataType(string-str);

您不能在接口定义中保持
t
打开。您必须像这样关闭类型

DataTypeModel<SomeType> GetDataType(string str);
DataTypeModel-GetDataType(string-str);

变量
dataTypeModel
未在代码的任何位置声明

如果要以通用方式返回,应执行以下操作:

public DataTypeModel<T> GetDataType<T>(string str) where T : class
    {
        List<DataTypeDomain> dataTypeDomain = new List<DataTypeDomain>();
        _dataProvider.ExecuteCmd(
            "config_select_by_key",
            inputParamMapper: delegate (SqlParameterCollection paramCol)
            {
                paramCol.AddWithValue("@ConfigKey", str);
            },
            singleRecordMapper: delegate (IDataReader reader, short set)
            {
                int i = 0;
                DataTypeModel<int> dataTypeModel = new DataTypeModel<int>();
                string key = string.Format("Key{0}", i);
                DataTypeDomain dtd = dataTypeDomain.Find(x => x.ConfigKey == key);
                dataTypeModel.ConfigKey = dtd.ConfigKey;
                dataTypeModel.ConfigValue = int.Parse(dtd.ConfigValue);
            }
        );
        return new DataTypeModel<T>()
        {
            ConfigKey = "What your key is",
            ConfigValue = dataTypeDomain.First() as T //Supposing that the list only contains one config element , if not, you should change your method return type to a List<DataTypeModel<T>> and return a List doing this for each element.
        };
    }
此外,如果您想指定
T
应该遵循的一些约束,您可以使用:

where T : class;  --> In our case this allow us to cast the object to T

代码没有经过测试,但我想它应该可以工作。

变量
dataTypeModel
没有在代码的任何地方声明

如果要以通用方式返回,应执行以下操作:

public DataTypeModel<T> GetDataType<T>(string str) where T : class
    {
        List<DataTypeDomain> dataTypeDomain = new List<DataTypeDomain>();
        _dataProvider.ExecuteCmd(
            "config_select_by_key",
            inputParamMapper: delegate (SqlParameterCollection paramCol)
            {
                paramCol.AddWithValue("@ConfigKey", str);
            },
            singleRecordMapper: delegate (IDataReader reader, short set)
            {
                int i = 0;
                DataTypeModel<int> dataTypeModel = new DataTypeModel<int>();
                string key = string.Format("Key{0}", i);
                DataTypeDomain dtd = dataTypeDomain.Find(x => x.ConfigKey == key);
                dataTypeModel.ConfigKey = dtd.ConfigKey;
                dataTypeModel.ConfigValue = int.Parse(dtd.ConfigValue);
            }
        );
        return new DataTypeModel<T>()
        {
            ConfigKey = "What your key is",
            ConfigValue = dataTypeDomain.First() as T //Supposing that the list only contains one config element , if not, you should change your method return type to a List<DataTypeModel<T>> and return a List doing this for each element.
        };
    }
此外,如果您想指定
T
应该遵循的一些约束,您可以使用:

where T : class;  --> In our case this allow us to cast the object to T

代码没有经过测试,但我想它应该可以工作。

当您在代码块中声明变量时(即在
{
}
之间),该变量相对于该代码块是私有的。因此无法返回
dataTypeModel
,因为它是在上面的代码块中声明的。您可能需要在委托之外声明
dataTypeModel
,将其转换为一个。我一直很好奇,既然已经有很多好的orm,为什么人们还要麻烦自己滚动它们自己的orm。没有人拥有自己的IIS、文件阅读器、电子邮件发送者等;是什么让人们想要不断地重新发明数据访问轮?尽管@johnWu指出了变量作用域的错误,但当您在代码块(即
{
}
之间)中声明变量时,您还需要使委托逻辑通用(不要使用int,而是T),该变量对于该代码块是私有的。因此无法返回
dataTypeModel
,因为它是在上面的代码块中声明的。您可能需要在委托之外声明
dataTypeModel
,将其转换为一个。我一直很好奇,既然已经有很多好的orm,为什么人们还要麻烦自己滚动它们自己的orm。没有人拥有自己的IIS、文件阅读器、电子邮件发送者等;是什么让人们想要不断地重新发明数据访问轮?尽管@johnWu指出了变量作用域的错误,但您还需要使委托逻辑通用(不要使用int,而是T)