我有大量自动生成的对象。尽管它们都是不同的、不相关的类,但所有对象都共享一些基本属性(名称、id 等)。我无法控制这些对象的生成,因此不幸的是我无法采取实现接口的理想方法。我想创建一种方法,在其中传递这些对象中的任意一个,并使用这些公共属性执行某些操作。
总体思路是这样的:
someObj a = new someObj();
a.name = "sara";
diffObj b = new diffObj();
b.name = "joe";
string phrase = string.Format("I am with {0} and {1}",
getName(a), getName(b));
private string getName(object anyObjWithName)
{
return anyObjWithName.name;
}
虽然这自然是行不通的。
我认为通用方法可能包含答案,但我能看到用当前类型调用它的唯一方法是使用genericMethod.Invoke
,它仍然存在相同的问题,即无法解析方法中传递的对象的属性。这与使用仅在执行时已知的类型参数调用泛型方法 https://stackoverflow.com/questions/325156/calling-generic-method-with-a-type-argument-known-only-at-execution-time or 如何使用给定的 Type 对象调用泛型方法? https://stackoverflow.com/questions/1408120/how-to-call-generic-method-with-a-given-type-object其中,方法中仅使用类型或类型的属性,而不是对象的属性。
我知道这(非常)容易出错,但我可以保证遇到的所有对象都将具有被操作的公共属性。
我可以保证遇到的所有对象都将具有被操作的共同属性
如果是这种情况,您可以使用dynamic
:
private string getName(dynamic anyObjWithName)
{
return anyObjWithName.name;
}
请注意,使用任何没有name
属性在运行时才会失败。
如果您想增加一点安全性,您可以乘坐RuntimeBinderException
如果该属性不存在,则会抛出异常:
private string getName(dynamic anyObjWithName)
{
try {
return anyObjWithName.name;
}
catch(RuntimeBinderException) {
return "{unknown}";
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)