簡體   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