3

在 PHP 中,我可以使用变量变量来动态访问类属性,如下所示:

class foo 
{
    public $bar = 'test';
}

$a = 'bar'; 
$obj = new foo;

echo $obj->$a; // output 'test'

我怎么能在 C# 中做这样的事情?

4

2 回答 2

2

假设:

public class Foo
{
    public String bar { get; set; }
}

// instance that you want the value from
var instance = new Foo { bar = "baz" };

// name of property you care about
String propName = "bar";

您可以使用:

// Use Reflection (ProperyInfo) to reference the property
PropertyInfo pi = instance.GetType()
    .GetProperty(propName);

// then use GetValue to access it (and cast as necessary)
String valueOfBar = (String)pi.GetValue(instance);

最终结果:

Console.WriteLine(valueOfBar); // "baz"

让事情变得更容易:

public static class PropertyExtensions
{
    public static Object ValueOfProperty(this Object instance, String propertyName)
    {
        PropertyInfo propertyInfo = instance.GetType().GetProperty(propertyName);
        if (propertyInfo != null)
        {
            return propertyInfo.GetValue(instance);
        }
        return null;
    }

    public static Object ValueOfProperty<T>(this Object instance, String propertyName)
    {
        return (T)instance.ValueOfProperty(propertyName);
    }
}

并给出与上述相同的假设:

// cast it yourself:
Console.WriteLine((String)instance.ValueOfProperty(propName)); // "baz"

// use generic argument to cast it for you:
Console.WriteLine(instance.ValueOfProperty<String>(propName)); // "baz"
于 2013-09-03T13:35:24.103 回答
0

您不会这样做,C# 不支持变量变量。您可以使用反射来获取属性值,但这是另一回事,因为您将失去强类型等。很简单,归结为您为什么要这样做?在大多数情况下,您不需要这样做,因为通常有比运行时解析值更好的选择。

您可以做的是使用基于字符串的字典(即。Dictionary<string, string>)通过键索引您的值。

然后,您可以执行以下操作:

class Foo
{
    public Dictionary<string, string> values = new Dictionary<string, string>();

    public Foo()
    {
        values["foo"] = "test";
    }
}

var test = "foo";
var foo = new Foo();
Console.WriteLine(foo.values[test]);
于 2013-09-03T13:35:08.830 回答