Как C # должен знать, что TDataObject
имеет свойство IntProperty
? Все, что вы говорите, это то, что TDataObject
должно быть class
с where TDataObject : class
. Вы должны указать ограничение, которое позволяет C # знать об этом свойстве (и, возможно, других). Э.Г.
public interface IProperties
{
int IntProperty { get; set; }
double DoubleProperty { get; set; }
string StringProperty { get; set; }
}
public interface IPropertyDictionary<TDataObject> where TDataObject : IProperties
{
void AddIfSameType<TProperty>(
Expression<Func<TDataObject, TProperty>> getProp, TProperty value);
}
Тогда вы можете объявить словарь с помощью
public class PropDictionary<TDataObject> : IPropertyDictionary<TDataObject>
where TDataObject : IProperties
{
public void AddIfSameType<TProperty>(
Expression<Func<TDataObject, TProperty>> getProp, TProperty value)
{
}
}
и класс данных
public class DataObject : IProperties
{
public int IntProperty { get; set; }
public double DoubleProperty { get; set; }
public string StringProperty { get; set; }
}
Теперь оба эти вызова работают
var propDictionary = new PropDictionary<DataObject>();
propDictionary.AddIfSameType(e => e.DoubleProperty, 123);
propDictionary.AddIfSameType(e => e.IntProperty, 123L);
Почему они работают?
Первый, потому что типы выводятся как
void ProperDictionary<DataObject>.AddIfSameType<double>(
Expression<Func<DataObject, double>> getProp, double value)
Переданное значение int
просто приведено к double
.
Второй случай немного удивителен. Типы определены как
void ProperDictionary<DataObject>.AddIfSameType<long>(
Expression<Func<DataObject, long>> getProp, longvalue)
Я предполагаю, что возвращаемое значение неявно расширено:
e => (long)e.IntProperty
Вывод: C # умнее, чем вы думаете. Он выводит универсальные типы и автоматически приводит значения, чтобы он работал, где это возможно.
UPDATE
Поэтому используйте два различных параметра типа для типа возвращаемого значения Func
и значения.
public void AddIfSameType<TProp, TValue>(
Expression<Func<TDataObject, TProp>> getProp, TValue value)
{
if (typeof(TProp) == typeof(TValue)) {
} else {
}
}
C # выведет точный тип для каждого из этих параметров типа. Вместо этого вы также можете ввести значение object
, но с учетом стоимости типов значений.