2017-07-28 125 views
1

我想寫一個使用不同類的Name屬性的方法,並用它做一些邏輯。從沒有繼承的不同類訪問一個Class.Name屬性

在我exampel保持它的簡單,我將自己限制在僅僅返回Name值:

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

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

/* 
... 
*/ 

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

可悲的是類不是從具有Name屬性父類inherting。此外,它不可能實現或添加一個接口。


簡短回顧:
是否可以寫一個使用Name屬性沒有被確認類實現了性能的通用方法?


+2

您應該使用'interface'來定義'Name'屬性。 –

+1

是https://stackoverflow.com/questions/2998954/test-if-a-property-is-available-on-a-dynamic-variable一個選項? – mjwills

+2

在C#中沒有'動態'或'反射'不可能,但基類或接口是更習慣的,類型安全的方法。 –

回答

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#提供的所有類型安全性。

+0

你的回答質量比我撰寫的質量高得多。我仍然要感謝[mjwills](https://stackoverflow.com/users/34092/mjwills)誰指示我正確答案[這裏](https://stackoverflow.com/a/5768449/5757162)bevor you回答它:) –

相關問題