Написание универсального в C # для возврата типа данных - PullRequest
0 голосов
/ 13 декабря 2018

Нужны некоторые рекомендации по написанию универсального C # для возврата типа данных из базы данных SQL.Я делаю чтение из моей базы данных, чтобы получить тип данных из «SetKey».Я могу вернуть их как строки, но я хочу привести их к типу int, в этом конкретном примере ниже.Это то, что я до сих пор.Я столкнулся с парой ошибок ниже, где я прокомментировал.Я довольно новичок в этом, поэтому любой вклад или предложения будут с благодарностью.Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Переменная 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

Код не проверен, но я думаю, что он должен работать.

0 голосов
/ 13 декабря 2018

Вы не можете оставить T открытым в определении вашего интерфейса.Вы должны закрыть тип как

DataTypeModel<SomeType> GetDataType(string str);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...