如何使用C#中的变量调用对象的属性,例如客户和放大器;字段名

时间:2009-03-24 09:07:38

标签: c#

在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();
        }

    }
}

4 个答案:

答案 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());
}