Обновление : см. здесь , чтобы получить рабочий пример того, что, я думаю, вы пытаетесь сделать.
( Обновление 2 : Похоже, вы уже поняли это незадолго до того, как я опубликовал это. Хорошо! Я все равно оставлю это для справки, хотя это не очень эффективная реализация.)
Нижедемонстрационная программа.
class CustomType
{
public int Integer { get; set; }
public double Double { get; set; }
public bool Boolean { get; set; }
public string String { get; set; }
public override string ToString()
{
return string.Format("int: {0}, double: {1}, bool: {2}, string: {3}", Integer, Double, Boolean, String);
}
}
class Program
{
public static void Main(string[] args)
{
var mapper = new InputMapper<CustomType>();
mapper.Map("10", x => x.Integer, "Unable to set Integer property.");
mapper.Map("32.5", x => x.Double, "Unabled to set Double property.");
mapper.Map("True", x => x.Boolean, "Unable to set Boolean property.");
mapper.Map("Hello world!", x => x.String, "Unable to set String property.");
var customObject = mapper.Create();
Console.WriteLine(customObject);
Console.ReadKey();
}
}
Вывод:
int: 10, double: 32.5, bool: True, string: Hello world!
Похоже, вы хотите определить свою Map
функцию следующим образом:
class InputMapper<T>
{
public void Map<TProperty>(string input,
Expression<Func<T, TProperty>> propertyExpression,
string errorMessage);
}
Тогда, по-видимому, вы хотите из propertyExpression
определить, какое свойство вы хотите установить на основе пользовательского ввода.Это верно?
Я не полностью ясно, почему вы не хотите просто определить это так:
class InputMapper<T>
{
public void Map<TProperty>(string input,
Action<TProperty> propertySetter,
string errorMessage);
}
Тогда использованиебудет выглядеть примерно так:
mapper.Map<int>(
"some user input",
value => someType.IntProperty = value,
"Input was not an integer"
);
(обратите внимание, что ваша функция Map<TProperty>
внутренне должна была бы обрабатывать вопрос парсинга пользовательского ввода в соответствующий тип, возможно, используя что-то простое, например Convert.ChangeType
.)