我有屬性叫做reel1,reel2,reel3和reel4。我如何通過傳遞一個整數(1-4)到我的方法來動態引用這些屬性?如何動態引用C#中增加的屬性?
具體而言,我正在尋找如何在不知道對象名稱的情況下獲取對象引用。
在Javascript中,我會做:
temp = eval("reel" + tempInt);
和臨時將等於reel1的對象。
似乎無法在C#中找出這個簡單的概念。
我有屬性叫做reel1,reel2,reel3和reel4。我如何通過傳遞一個整數(1-4)到我的方法來動態引用這些屬性?如何動態引用C#中增加的屬性?
具體而言,我正在尋找如何在不知道對象名稱的情況下獲取對象引用。
在Javascript中,我會做:
temp = eval("reel" + tempInt);
和臨時將等於reel1的對象。
似乎無法在C#中找出這個簡單的概念。
您可以使用PropertyInfo
通過包含屬性名稱的字符串來訪問屬性值。
例子:
PropertyInfo pinfo = this.GetType().GetProperty("reel" + i.ToString());
return (int)pinfo.GetValue(this, null);
這東西是典型的C#避免。通常還有其他更好的選擇。
話雖這麼說,你可以使用反射來獲得一個屬性的值是這樣的:
object temp = this.GetType().GetProperty("reel" + tempInt.ToString()).GetValue(this, null);
一個更好的選擇,然而,可能是你的類使用Indexed Property,這將讓你做this[tempInt]
。
只需重申,不要這樣做。使用索引器 – 2010-04-12 15:47:45
嘗試this link 獲取屬性對應的PropertyInfo對象,然後就可以通過它的實例中使用的GetValue上要評估物業
這是的事情之一,你可以在解釋與逃脫像JavaScript這樣的語言,這在像C#這樣的編譯語言中非常困難。最好採取另一個大頭釘:
switch(tempInt)
{
case 1:
temp = reel1;
break;
case 2:
temp = reel2;
break;
case 3:
temp = reel3;
break;
}
使用InvokeMember和BindingFlags.GetProperty。您必須擁有對「擁有」對象的引用,並且您必須知道您嘗試檢索的屬性的類型。
namespace Cheeso.Toys
{
public class Object1
{
public int Value1 { get; set; }
public int Value2 { get; set; }
public Object2 Value3 { get; set; }
}
public class Object2
{
public int Value1 { get; set; }
public int Value2 { get; set; }
public int Value3 { get; set; }
public override String ToString()
{
return String.Format("Object2[{0},{1},{2}]", Value1, Value2, Value3);
}
}
public class ReflectionInvokePropertyOnType
{
public static void Main(string[] args)
{
try
{
Object1 target = new Object1
{
Value1 = 10, Value2 = 20, Value3 = new Object2
{
Value1 = 100, Value2 = 200, Value3 = 300
}
};
System.Type t= target.GetType();
String propertyName = "Value3";
Object2 child = (Object2) t.InvokeMember (propertyName,
System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.GetProperty,
null, target, new object [] {});
Console.WriteLine("child: {0}", child);
}
catch (System.Exception exc1)
{
Console.WriteLine("Exception: {0}", exc1.ToString());
}
}
}
}
在Javascript中,這就是你如何做到這一點,但除非有很好的理由,遠離'eval'。 – 2010-04-12 15:43:03
是的,不需要eval - 只需使用括號表示法,如'myObj ['reel'+ tempInt]'。請注意,如果這些屬性是全局屬性,那麼您的對象將是'window' - 所以'window ['reel'+ tempInt]' – jbyrd 2017-07-03 13:15:25