变量是否可以用作属性
本文关键字:属性 是否 变量 | 更新日期: 2023-09-27 18:35:19
我想做这样的事情:
string currPanel = "Panel";
currPanel += ".Visible"
现在在这一点上,我有一个字符串变量,其名称为仅接受布尔值的属性。我可以做一些这样的事情吗:
<data type> currPanel = true;
所以实际属性Panel1.Visible
接受它而没有任何错误?
同时支持属性和字段,但仅支持实例:
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]
)将非常困难。
从我在这里看到的是你正在使用WPF。使用转换器完成这样的事情
http://www.codeproject.com/Tips/285358/All-purpose-Boolean-to-Visibility-Converter
使用 MVVM 和 WPF,您永远不需要这样做