![](/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.