我正在尝试编写一个使用不同类的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
属性的泛型方法,而不确定该类是否已实现该属性?
答案 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#提供的所有类型安全性。