Используя Дженерики для возврата литеральной строки или из Словаря <строка, объект>

Я думаю, что перехитрил меня на этот раз. Не стесняйтесь редактировать заголовок, также я не мог думать о хорошем.

Я читаю из файла, и затем в том файле будет строка потому что как XML-файл. Но в файле будет литеральное значение или "команда" для получения значения от workContainer

так

<Email>me@company.com</Email>

или

<Email>[? MyEmail ?]</Email>

Что я хотел сделать вместо того, чтобы писать IFS повсеместно для помещения его в родовую функцию

таким образом, логика

If Container command grab from container else grab string and convert to desired type 
Its up to the user to ensure the file is ok and the type is correct 

таким образом, другой пример

так

<Answer>3</Answer>

или

<Answer>[? NumberOfSales ?]</Answer>

Это - процедура, я начал продолжать работать

public class WorkContainer:Dictionary<string, object>
{
    public T GetKeyValue<T>(string Parameter) 
    {
        if (Parameter.StartsWith("[? "))
        {
            string key = Parameter.Replace("[? ", "").Replace(" ?]", "");

            if (this.ContainsKey(key))
            {
                return (T)this[key];
            }
            else
            {
                // may throw error for value types
                return default(T);
            }

        }
        else
        {
            // Does not Compile
            if (typeof(T) is string)
            {
                return Parameter
            }
            // OR return (T)Parameter

        }
    }
}

Вызов был бы

  mail.To = container.GetKeyValue<string>("me@company.com");

или

  mail.To = container.GetKeyValue<string>("[? MyEmail ?]");

  int answer = container.GetKeyValue<int>("3");

или

  answer = container.GetKeyValue<int>("[? NumberOfSales ?]");

Но это не компилирует?

1
задан Mike 22 April 2010 в 13:50
поделиться

5 ответов

Вот ответ, который я придумал. Я немного беспокоюсь о боксе и распаковке, но пока это работает

public class WorkContainer:Dictionary<string, object>
{
    public T GetKeyValue<T>(string Parameter) 
    {
        if (Parameter.StartsWith("[? "))
        {
            string key = Parameter.Replace("[? ", "").Replace(" ?]", "");

            if (this.ContainsKey(key))
            {
                if (typeof(T) == typeof(string) )
                {
                    // Special Case for String, especially if the object is a class
                    // Take the ToString Method not implicit conversion
                    return (T)Convert.ChangeType(this[key].ToString(), typeof(T));
                }
                else
                {
                    return (T)this[key];
                }
            }
            else
            {
                return default(T);
            }

        }
        else
        {                
            return (T)Convert.ChangeType(Parameter, typeof(T));
        }
    }
}
0
ответ дан 3 September 2019 в 01:06
поделиться

Изменение:

if (typeof(T) is string)

на:

if (typeof(T) == typeof(String))

Оператор is действителен только для экземпляров класса. T на самом деле не является экземпляром, это тип, поэтому его использование не будет компилироваться в вашем коде, потому что вам нужно сравнить 2 типа. Вы можете прочитать об этом на msdn здесь .

0
ответ дан 3 September 2019 в 01:06
поделиться
if(typeof(T) == typeof(string))
{
    return (T)Parameter;
}
else
{
    // convert the value to the appropriate type
}
2
ответ дан 3 September 2019 в 01:06
поделиться

Используйте typeof (T) == typeof (string)

0
ответ дан 3 September 2019 в 01:06
поделиться

строка

if (typeof(T) is string)

всегда будет возвращать false, так как оператор typeof предоставляет объект Type. Вы должны заменить его на

if (T is string)

. Кроме того, вам следует изучить метод Convert.ChangeType . Здесь это может помочь.

0
ответ дан 3 September 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: