首先,我将描述我想要实现的目标。
我想创建一个获取属性名称及其值用于记录目的的方法,所以我有这个:
public void Log<TPropertySource, TProperty>(Expression<Func<TPropertySource, object>> property, TProperty initialValue, TProperty changedValue){...}
现在这需要我指定属性的类型,即 .. meh,因为理论上我可以从表达式中提取它;然而,表达式需要返回一个对象以适应该属性可能具有的所有可能类型。
我正在考虑只对 BCL 最常用的值类型进行重载,并为其他所有内容重载对象,例如
public void Log<TPropertySource>(Expression<Func<TPropertySource, string>> property, string initialValue, string changedValue){...}
public void Log<TPropertySource>(Expression<Func<TPropertySource, int>> property, int initialValue, int changedValue){...}
但它也不理想,因为我最终会遇到十几个重载
所以基本上我想知道是否有更好的(懒惰的)方法来做到这一点?
还有一个问题:为什么我在 Log<TPropertySource>(Expression<Func<TPropertySource, int>> property, int initialValue, int changedValue)上没有智能感知?如果我输入logger.Log<A>(x => x.Age, 1, 2); - 它编译得很好,但智能感知不会启动。