![](/img/trans.png)
[英]How to access the derived class properties from base class instance using generic method
[英]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.