如何通过 C# 中的接口访问对象的 属性
How to access an object's property through its interface in C#
我有一个 class A 和一个 属性 A.A 和一个 class B 和一个 属性 B.B。两者都实现了 I2C 接口,该接口强制执行 IC.C 属性,但不执行 A.A 或 B.B。
我想要一个接收 A 或 B 的实例作为参数并可以访问这些属性的方法,例如:
void MyMethod(IC obj)
{
if (obj.GetType().Name.Equals("A"))
{
var v = obj.A; // some code for access the property
}
}
这可能吗?而且,这是个好主意吗?
谢谢!
已编辑:按照@dmedine 的建议将接口重命名为 IC。
最佳方法取决于您要执行的操作的具体细节,但这里有 2 个选项:
模式匹配
void MyMethod(C obj)
{
if (obj is A objAsA)
{
var vA = objAsA.A;
}
if (obj is B objAsB)
{
var vB = objAsB.B;
}
}
反思
void MyMethod(C obj)
{
var objType = obj.GetType();
if (objType.Name.Equals("A"))
{
var prop = objType.GetProperty("A");
var v = prop.GetValue(obj, null);
}
}
在我看来,这样做在某些情况下很有用。例如,如果你有一堆继承自接口 IC
的对象(接口的名称总是以 I 开头),它们具有相似但又独特的 properties/methods(迫不及待地等待评论)滚进来)。您可以测试使用 is
继承的 class 的类型。例如,假设 A
和 B
实现 IC
:
void MyMethod(List<IC> objects)
{
foreach(IC object in objects)
{
var cProperty = object.CProperty; // use common property
if(object is A a)
var aProperty = a.AProperty; // if A, use unique property
}
}
void Foo()
{
List<IC> cObjects = new();
cObjects.Add(new A());
cObjects.Add(new B());
MyMethod(cObjects);
}
我有一个 class A 和一个 属性 A.A 和一个 class B 和一个 属性 B.B。两者都实现了 I2C 接口,该接口强制执行 IC.C 属性,但不执行 A.A 或 B.B。
我想要一个接收 A 或 B 的实例作为参数并可以访问这些属性的方法,例如:
void MyMethod(IC obj)
{
if (obj.GetType().Name.Equals("A"))
{
var v = obj.A; // some code for access the property
}
}
这可能吗?而且,这是个好主意吗? 谢谢!
已编辑:按照@dmedine 的建议将接口重命名为 IC。
最佳方法取决于您要执行的操作的具体细节,但这里有 2 个选项:
模式匹配
void MyMethod(C obj)
{
if (obj is A objAsA)
{
var vA = objAsA.A;
}
if (obj is B objAsB)
{
var vB = objAsB.B;
}
}
反思
void MyMethod(C obj)
{
var objType = obj.GetType();
if (objType.Name.Equals("A"))
{
var prop = objType.GetProperty("A");
var v = prop.GetValue(obj, null);
}
}
在我看来,这样做在某些情况下很有用。例如,如果你有一堆继承自接口 IC
的对象(接口的名称总是以 I 开头),它们具有相似但又独特的 properties/methods(迫不及待地等待评论)滚进来)。您可以测试使用 is
继承的 class 的类型。例如,假设 A
和 B
实现 IC
:
void MyMethod(List<IC> objects)
{
foreach(IC object in objects)
{
var cProperty = object.CProperty; // use common property
if(object is A a)
var aProperty = a.AProperty; // if A, use unique property
}
}
void Foo()
{
List<IC> cObjects = new();
cObjects.Add(new A());
cObjects.Add(new B());
MyMethod(cObjects);
}