处理具有共同属性但不同对象类型的对象的方法

Max*_*rty 5 c# asp.net

我有一大堆自动生成的对象.尽管它们都是不同的非相关类,但所有对象都共享一些基本属性(名称,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;
}
Run Code Online (Sandbox Code Playgroud)

虽然自然这不起作用.

我认为泛型方法可能会有答案,但我能看到用当前类型调用它的唯一方法是使用genericMethod.Invoke,这仍然带有同样的问题,即无法解析方法中传递的对象的属性.这与Calling泛型方法不同,它只有在执行时才知道的类型参数如何用给定的Type对象调用泛型方法?其中只有类型的类型或属性在方法中使用,而不是对象的属性.

我知道这会(非常)容易出错,但我可以保证遇到的所有对象都会被操纵共同的属性.

D S*_*ley 9

我可以保证遇到的所有对象都会被操纵共同的属性

如果是这种情况,您可以使用dynamic:

private string getName(dynamic anyObjWithName)
{
    return anyObjWithName.name;
}
Run Code Online (Sandbox Code Playgroud)

请注意,使用任何没有name属性的对象在运行时才会失败.

如果你想添加一点安全性,你可以捕获RuntimeBinderException如果属性不存在则抛出的东西:

private string getName(dynamic anyObjWithName)
{
    try {
        return anyObjWithName.name;
    }
    catch(RuntimeBinderException) {
        return "{unknown}";
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 对于我的$ .02,我认为OP无法开始"动态"路径.这条路充满了危险,这个答案根本不是教学法. (3认同)