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

标签 c# asp.net

我有大量自动生成的对象。尽管它们都是不同的、不相关的类,但所有对象都共享一些基本属性(名称、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 timeHow 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/

相关文章:

c# - 如何将对象数组转换为泛型类型数组

C#连接变为空

asp.net - 如何检测请求是否是 Global.asax 中的回调?

javascript - 过滤谷歌地图范围内的标记

c# - 错误 : Object reference not set to an instance of an object. 但在返回 View 中提供了模型

c# - 可观察模型中的 IEnumerable

c# - 使用 Entity Framework 的一对一关系中的主键错误

c# - 带有 Xamarin 的 Visual Studio(C#) 中的 OBD II 应用程序

c# - 将列表保存到数据库

C#网络应用程序用户无故注销