在C#中有一种方法可以用变量调用对象的属性,如下所示:
string fieldName = "FirstName";
Console.WriteLine(customer.&fieldName);
非常好,感谢快速解答,这就是我想要做的事情:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace TestLinqFieldIndex
{
class Program
{
static void Main(string[] args)
{
List<Customer> customers = new List<Customer>();
customers.Add(new Customer { ID = 1, FirstName = "Jim", LastName = "Smith" });
customers.Add(new Customer { ID = 2, FirstName = "Joe", LastName = "Douglas" });
customers.Add(new Customer { ID = 3, FirstName = "Jane", LastName = "Anders" });
var customer = (from c in customers
where c.ID == 2
select c).SingleOrDefault();
string[] fieldNames = { "FirstName", "LastName" };
foreach (string fieldName in fieldNames)
{
Console.WriteLine("The value of {0} is {1}.", fieldName, customer.GetPropertyValue(fieldName));
}
Console.ReadLine();
}
}
public class Customer
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string GetPropertyValue(string fieldName)
{
PropertyInfo prop = typeof(Customer).GetProperty(fieldName);
return prop.GetValue(this, null).ToString();
}
}
}
答案 0 :(得分:6)
你可以使用反射来做到这一点。
PropertyInfo prop = typeof(Customer).GetProperty ("FirstName");
Console.WriteLine (prop.GetValue (customer, null));
甚至可以检索私有财产的价值。为此,您必须查看接受绑定标志的重载GetProperty
方法。
答案 1 :(得分:3)
你不能开箱即用;你必须使用PropertyInfo
对象和反射:
Apple myApple = new Apple("Golden Delicious", Ripeness.Fresh);
// ...
var p = typeof(Apple).GetProperty("Variety");
Console.WriteLine(p.GetValue(myApple, null)); // "Golden Delicious"
请注意,C#4将支持动态属性访问和其他优点。但我想你不想等那么久。 :)
答案 2 :(得分:1)
您可以将所述对象的属性值存储在字典中,并从类外部提供对该字典的访问,或使用反射。除此之外,我想不出办法做到这一点。
但是,无论解决方案如何,您都会失去类型安全性。你到底想要完成什么?
您可能会发现解决此问题的正确方法是使用类似策略模式的方法。这样就可以将使用属性的逻辑封装到知道它们需要哪些属性的类中,然后在运行时决定实例化哪些策略类并将其传递给对象。
正如Frederik在下面所说的那样,你可以使用反射,但同样会出现类型安全性参数,你可能会发现你在设计时遇到了无法立法的运行时错误。
答案 3 :(得分:1)
只需使用Reflection API。
下面的示例说明了如何检索返回字符串的属性的值:
public string GetValue(string propertyName, object MyInstance)
{
Type instanceType = typeof(MyInstance);
// Set the BindingFlags depending on your property type or simply skip them.
PropertyInfo pi = instanceType.GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
// If this is an indexer property, provide the index as the second parameter,
// else just supply null.
return (pi.GetValue(MyInstance, null).ToString());
}