Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在不继承的情况下从不同的类中访问Class.Name属性_C#_Generic Programming - Fatal编程技术网

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#中是不可能的,但基类或接口更为惯用,但是我必须在我希望传递的所有类中实现接口,例如。在
中。如果我没有弄错的话,这将是从基类继承的相同结果。您答案的可能副本的质量要比我编写的答案高很多。我仍然要感谢是谁让我找到了正确的答案,因为你回答了:)