如何从基类设置派生类属性
本文关键字:派生 属性 设置 基类 | 更新日期: 2023-09-27 18:18:34
我首先要说的是,我非常清楚这样做的危险,并且100%明白这是一个"坏主意"……但是…
如何从基类设置派生类属性?
public class Foo
{
public void SetSomeValue(int someParam)
{
var propertyInfo = this.GetType()
.GetProperties(BindingFlags.Instance | BindingFlags.Public)
.Where(t => t.Name == "SomeValue")
.First();
propertyInfo.SetValue(null, someParam); // <-- This shouldn't be null
}
}
public class Bar : Foo
{
public int SomeValue { get; set; }
}
如何获得属性值以便调用SetValue?
编辑:这其实很简单。哎。
propertyInfo.SetValue(this, someParam);
propertyInfo.SetValue(this, someParam);
用法:
var bar = new Bar {SomeValue = 10};
bar.SetSomeValue(20);
Console.WriteLine(bar.SomeValue); // Should be 20
声明:
public class Foo
{
public void SetSomeValue(int someParam)
{
var propertyInfo = this.GetType()
.GetProperties(BindingFlags.Instance | BindingFlags.Public).First(t => t.Name == "SomeValue");
propertyInfo.SetValue(this, someParam, null);
}
}
public class Bar : Foo
{
public int SomeValue
{
get;
set;
}
}
您可以随意更改接口。这样至少可以耦合到一个接口,而不是实际的派生类。
public class Foo {
public void SetSomeValue(int someParam) {
if (this is ISomeValueHolder) {
((ISomeValueHolder)this).SomeValue = someParam;
}
}
}
public interface ISomeValueHolder {
int SomeValue { get; set; }
}
public class Bar : Foo, ISomeValueHolder {
public int SomeValue { get; set; }
}