有没有办法在类型参数中指定参数是对象实例的类型?
例如,为了说明,我有:
public abstract class Model
{
public int Prop1 { get; set; }
}
对于我的示例,我想要一个方法来返回Model
传入的属性(显然这是一个愚蠢的方法,但它明白了重点)。我可以使它作为扩展方法工作:
public static class Extensions
{
public static U Property<T, U>(this T model, Expression<Func<T, U>> property) where T : Model
{
return property.Compile().Invoke(model);
}
}
这样我就可以拥有
public class DerivedModel : Model
{
public string Prop2 { get; set; }
}
做
var myString = new DerivedModel().Property(a => a.Prop2);
这个方法看起来应该是Model
类的一部分,看起来像:
public T Property<T>(Expression<Func<ThisDerivedInstanceOfModel, T>> property)
{
return property.Compile().Invoke(this);
}
以便Property()
对扩展方法所做的相同调用可以在Model
.
我意识到这有点奇怪,可能根本不是 C# 的一个特性,而且变通方法扩展方法工作得很好——但如果可能的话,我更愿意把它作为一个实例方法,因为对我来说似乎“更好”。