我有大量自动生成的对象。尽管它们都是不同的、不相关的类,但所有对象都共享一些基本属性(名称、ID 等)。 我不控制这些对象的生成,所以不幸的是我不能采用实现接口(interface)的理想方法。我想创建一个方法,在其中我传递这些对象中的任意一个并做一些事情使用这些通用属性。
总体思路是这样的:
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
,它仍然存在无法调用的相同问题解析方法中传递的对象的属性。这不同于 Calling generic method with a type argument known only at execution time或 How to call generic method with a given Type object?在方法中只使用类型或类型的属性,而不是对象的属性。
我知道这会(非常)容易出错,但我可以保证遇到的所有对象都将具有被操作的公共(public)属性。
最佳答案
I can guarantee that all objects encountered will have the common properties being manipulated
如果是这种情况,您可以使用dynamic
:
private string getName(dynamic anyObjWithName)
{
return anyObjWithName.name;
}
请注意,使用任何不具有 name
属性的对象都不会在运行时失败。
如果您想增加一点安全性,您可以捕获当属性不存在时抛出的 RuntimeBinderException
:
private string getName(dynamic anyObjWithName)
{
try {
return anyObjWithName.name;
}
catch(RuntimeBinderException) {
return "{unknown}";
}
}
关于c# - 处理具有共同属性但对象类型不同的对象的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18195639/