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

时间:2018-12-13 06:09:30

标签: c# generics casting

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

2 个答案:

答案 0 :(得分:2)

在代码的任何地方都没有声明变量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.
        };
    }

然后在您的界面中:

public interface IDataTypeService
{
    DataTypeModel<T> GetDataType<T>(string str) where T : class;
}

快速说明

使用泛型时,应在类似以下方法的方法上指定T:

DataTypeModel<T> GetDataType<T>(string str) --> Only use T inside method scope

声明T的另一种方法是在类/接口级别,如:

public interface IDataTypeService<T>  --> With this you can use `T` in all of the class/interface

此外,如果您想指定T应该遵守的一些约束条件,则可以使用以下方法:

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

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

答案 1 :(得分:0)

您无法在界面定义中保持T处于打开状态。您必须关闭类似

的类型
DataTypeModel<SomeType> GetDataType(string str);