如何从基类设置派生类属性

本文关键字:派生 属性 设置 基类 | 更新日期: 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; }
}