2017-05-13 59 views
0

如果在運行時將所需屬性的名稱作爲字符串提供,C#中的對象是否可以返回其屬性之一的值?如何使用屬性名稱作爲字符串獲取屬性值,如object [「foo」]

myObject["price"] 

比方說,我們有這樣的對象:

public class Widget 
{ 
    public Widget(){} 
    public DateTime productionDate {get;set;} 
    public decimal price {get;set;} 
} 

這SqlCommand的參數定義:

SqlCommand c = new SqlCommand(); 
c.Parameters.Add(new SqlParameter("@price", SqlDbType.SmallMoney,0,"price")); 

其他地方在不同範圍內的代碼,在用戶點擊了一個[Save Record]按鈕,現在我們需要將小部件對象中的值綁定到更新命令的參數。我們在變量command到SqlCommand的一個參考:

foreach (SqlParameter p in command.Parameters) 
{  
    // assume `parameter.SourceColumn` matches the widget attribute name 

    string attributeName = p.SourceColumn; 

    p.Value = widget[attributeName]  // ?? 
    } 
+2

我認爲你的意思是「屬性」,而不是在c#中有它自己的含義的屬性。是的,您可以使用反射按名稱獲取屬性值。 – Crowcoder

+0

要訪問屬性_exactly_就像你指的那樣,你需要某種類型的'Dictionary ',它可以讓你通過key訪問器獲得一個值'public TValue this [TKey key] {get;組; }' –

回答

1

加成Crowcoder:

您可以使用反射和調用Type.GetProperty(「nameOfProperty」)獲得的PropertyInfo上,您可以撥打GetMethod屬性。

GetMethod屬性返回一個MethodInfo,您可以在其上調用Invoke方法來檢索該屬性的值。

例如:

var propertyInfo = myObject.GetType().GetProperty("price"); 
var getMethod = propertyInfo.GetMethod; 
string value = getMethod.Invoke(myObject, null) as string 

編輯:

再次閱讀您的問題後,我意識到,我沒有回答你的問題。 你應該/可以結合我以前的答案與索引器: https://docs.microsoft.com/en-us/dotnet/articles/csharp/programming-guide/indexers/index

相關問題