在 PHP 中,我可以使用变量变量来动态访问类属性,如下所示:
class foo
{
public $bar = 'test';
}
$a = 'bar';
$obj = new foo;
echo $obj->$a; // output 'test'
我怎么能在 C# 中做这样的事情?
在 PHP 中,我可以使用变量变量来动态访问类属性,如下所示:
class foo
{
public $bar = 'test';
}
$a = 'bar';
$obj = new foo;
echo $obj->$a; // output 'test'
我怎么能在 C# 中做这样的事情?
假设:
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"
您不会这样做,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]);