我希望做这样的事情:
string currPanel = "Panel";
currPanel += ".Visible"
现在,此时我有一个字符串变量,其属性名称只接受布尔值。我可以做一些像这样的事情:
<data type> currPanel = true;
所以实际的属性Panel1.Visible
接受它没有任何错误?
答案 0 :(得分:2)
支持属性和字段,但只支持实例:
public static void SetValue(object obj, string name, object value)
{
string[] parts = name.Split('.');
if (parts.Length == 0)
{
throw new ArgumentException("name");
}
PropertyInfo property = null;
FieldInfo field = null;
object current = obj;
for (int i = 0; i < parts.Length; i++)
{
if (current == null)
{
throw new ArgumentNullException("obj");
}
string part = parts[i];
Type type = current.GetType();
property = type.GetProperty(part, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (property != null)
{
field = null;
if (i + 1 != parts.Length)
{
current = property.GetValue(current);
}
continue;
}
field = type.GetField(part, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if (field != null)
{
property = null;
if (i + 1 != parts.Length)
{
current = field.GetValue(current);
}
continue;
}
throw new ArgumentException("name");
}
if (current == null)
{
throw new ArgumentNullException("obj");
}
if (property != null)
{
property.SetValue(current, value);
}
else if (field != null)
{
field.SetValue(current, value);
}
}
使用示例:
public class Panel
{
public bool Visible { get; set; }
}
public class MyTest
{
public Panel Panel1 = new Panel();
public void Do()
{
string currPanel = "Panel1";
currPanel += ".Visible";
SetValue(this, currPanel, true);
}
}
和
var mytest = new MyTest();
mytest.Do();
请注意,我不支持索引器(例如Panel1[5].Something
)。支持int
索引器是可行的(但另外30行代码)。不支持 - int
索引器(如["Hello"]
)或多键索引器(如[1, 2]
)会非常困难。
答案 1 :(得分:-1)
从我可以看到的是你正在使用WPF。你用转换器完成这样的事情
http://www.codeproject.com/Tips/285358/All-purpose-Boolean-to-Visibility-Converter
使用MVVM和WPF,您永远不需要这样做