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