从不具有继承的不同类访问Class.Name属性

时间:2017-07-28 13:40:32

标签: c# generic-programming

我正在尝试编写一个使用不同类的Name属性的方法,并使用它做一些逻辑。

在我的例子中,为了简单起见,我将仅限于返回Name值:

class Dog
{
    public string Name { get; set; }
}

class Human
{
    public string Name { get; set; }
}

/*
 ...
*/

public string GetNameFromNameProperty(object obj)
{
    return obj.Name;
}

遗憾的是,这些类并不是来自具有Name属性的父类。此外,无法实现或添加接口。

简短回顾:
是否可以编写一个使用Name属性的泛型方法,而不确定该类是否已实现该属性?

1 个答案:

答案 0 :(得分:1)

如果确实不想让所有这些类实现公共接口或从基类继承,那么这里有两个选项:

反射:

public string GetNameFromNameProperty(object obj)
{
    var type = obj.GetType();
    return type.GetProperty("Name").GetValue(obj) as string;
}

动态绑定:

public string GetNameFromNameProperty(dynamic obj)
{
    try
    {
        return obj.Name;
    }
    catch (RuntimeBinderException)
    {
        throw new PropertyDoesntExistException();
    }
}

如果属性不存在,您也可以选择返回null。

但是,我强烈建议您使用接口或继承来执行此操作。如果使用上述方法,基本上会失去C#提供的所有类型安全性。