Я думаю, что перехитрил меня на этот раз. Не стесняйтесь редактировать заголовок, также я не мог думать о хорошем.
Я читаю из файла, и затем в том файле будет строка потому что как 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 ?]");
Но это не компилирует?
Вот ответ, который я придумал. Я немного беспокоюсь о боксе и распаковке, но пока это работает
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));
}
}
}
Изменение:
if (typeof(T) is string)
на:
if (typeof(T) == typeof(String))
Оператор is действителен только для экземпляров класса. T на самом деле не является экземпляром, это тип, поэтому его использование не будет компилироваться в вашем коде, потому что вам нужно сравнить 2 типа. Вы можете прочитать об этом на msdn здесь .
if(typeof(T) == typeof(string))
{
return (T)Parameter;
}
else
{
// convert the value to the appropriate type
}
строка
if (typeof(T) is string)
всегда будет возвращать false, так как оператор typeof предоставляет объект Type. Вы должны заменить его на
if (T is string)
. Кроме того, вам следует изучить метод Convert.ChangeType . Здесь это может помочь.