繁体   English   中英

如何从基类实例访问派生类属性

[英]How to access derived class properties from base class instance

我有以下代码无法访问或更改:

class A{
}

class B:A{
    string name;
    int age;
    string desc;
}

class C:A{
    string name;
    int age;
    string desc;
}

我需要找到一种方法来编写一个函数,为 B 和 C 的实例赋值。最简单的方法是编写两个函数。 每个班级一个。

void myFunc(B b){
    b.name = "some_name";
    b.age = 27;
    b.desc = "some_desc";
}

void myFunc(C c){
    c.name = "some_name";
    c.age = 27;
    c.desc = "some_desc";
}

有没有办法编写一个通用函数来完成工作? 当然,这些课程只是示例。 在现实世界中,从基类派生出许多类,每个类都有许多成员。

我们可以找到几种方法来做到这一点。 例如你可以对类型使用一个扩展方法: A 并使用反射来设置其中的字段。

像这样:

public static class ClassExtensions
{
    public static void SetProperties(this A a, string name, int age, string desc)
    {
        Type type = a.GetType();
        type.GetField("name")?.SetValue(a, name);
        type.GetField("age")?.SetValue(a, age);
        type.GetField("desc")?.SetValue(a, desc);
    }
}

这是它的工作原理: https : //dotnetfiddle.net/9uR3bA

或者只是使用动态,如:

public static void Main(string[] args)
{
    var b = new B();
    SetValues(b, "yes", 5, "ok");

    var c = new C();
    SetValues(c, "no", 10, "not ok");
}

public static void SetValues(dynamic theClass, string name, int age, string desc)
{
    theClass.name = name;
    theClass.age = age;
    theClass.desc = desc;
}

注意:我假设字段或属性是公开的,而不是私有的。

只是好奇:为什么不使用Automapper 它使用基于convention-based方法,当这还不够时,您可以自己编写映射代码并注入它。

这不是一个好的设计。 如果你能以任何方式改变它,强烈考虑这样做,但如果你不能,这就是你可以做的。

为此,您不需要反射。 向下转换将完成这项工作:

void MyMethod(A a)
{
    if (a is B b)
    {
        b.name = "some_name";
        b.age = 27;
        b.desc = "some_desc";        
    }

    if (a is C c)
    {
        c.name = "some_name";
        c.age = 27;
        c.desc = "some_desc";
    }
}

由于A是未密封的基类,因此可能存在其他派生类( class D : A等),但由于MyMethod不返回任何内容,因此将任何其他子类型作为参数传递只是无操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM