C# 在不继承的情况下从不同的类中访问Class.Name属性
我正在尝试编写一个方法,使用不同类的C# 在不继承的情况下从不同的类中访问Class.Name属性,c#,generic-programming,C#,Generic Programming,我正在尝试编写一个方法,使用不同类的Name属性,并对其进行一些逻辑处理 在我的示例中,为了保持简单,我将限制自己只返回名称值: class Dog { public string Name { get; set; } } class Human { public string Name { get; set; } } /* ... */ public string GetNameFromNameProperty(object obj) { return obj.
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
属性的泛型方法
如果您真的不想让所有这些类实现公共接口或从基类继承,那么这里有两个选项: 反思:
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#提供的所有类型安全性。您应该使用一个定义了
名称
属性的接口。
属性是一个选项吗?不,如果没有动态
或反射,在C#中是不可能的,但基类或接口更为惯用,但是我必须在我希望传递的所有类中实现接口,例如。在狗
和人
中。如果我没有弄错的话,这将是从基类继承的相同结果。您答案的可能副本的质量要比我编写的答案高很多。我仍然要感谢是谁让我找到了正确的答案,因为你回答了:)