我想创建一个GUI应用程序(MVC asp web应用程序)来创建可用于我的业务规则引擎的业务规则。
为此,我有几个具有各种变量的对象(请求对象),可以用来创建这些规则。因为这些请求对象也用于验证这些规则。
例如,我有一个TripRequest对象,它有一个字符串变量"Airline"和一个int变量"Price"。
我希望在我的GUI中,当您从各种请求对象的下拉菜单中选择"TripRequest"时。第二个下拉菜单充满了它的所有字段(航空公司、价格等)。
然后,当您选择其中一个字段时,它需要读取其类型(string,int),以便GUI可以为业务规则提供适当的操作(等于、不等于、大于、小于等)。
到目前为止,我创建这样一个GUI的想法是使用反射从各种对象中读取所有字段和方法名称,并使用它们填充GUI。这是使用反思的好方法吗?
我以前没有使用过反射,所以我想知道是否有更好的方法。我不想硬编码所有内容,因为应用程序需要可扩展(新的请求对象,添加到对象中的新字段),而不必向GUI添加更多代码。
我的问题:-反思是解决这个问题的好方法吗?-如果没有,你建议使用或查看什么?
这是我在stackoverflow上的第一个问题,如果我做错了什么,请告诉我,这样我就可以编辑或更改它。
感谢您阅读:)。
您不需要使用反射。替代方案包括使用某种外部元数据来匹配UI和数据(可能根据该元数据生成代码和UI),或者尝试静态分析代码(可能使用Roslyn!)以生成合适的UI。然而,反思可能远没有那么痛苦。潜在的不利因素。。。
- 如果您有深度嵌套或复杂的数据结构要在UI中公开,那么很难决定如何最好地做到这一点
- 如果你没有一套清晰的"面向UI"对象,并且具有一致的可见性规则,你将不得不花时间创建某种基于属性或约定的方案,以确保只公开你想要公开的内容
- 您可能只会在运行时(最坏的情况是,在部署中)发现未能正确公开一些很少使用的类型
话虽如此,如果你的数据类型通常只是一袋袋属性,那么反射是非常简单的。这里有一些玩具代码,展示了您需要的大多数相关技巧,包括设置数据绑定。请注意,在对象上反射时,通常使用属性而不是裸场。
class Program
{
[STAThread]
static void Main(string[] args)
{
var request = new TripRequest() {Airline = "Reflection Airways"};
var window = new Window();
var stackPanel = new StackPanel();
window.Content = stackPanel;
foreach (var property in request.GetType().GetProperties())
{
Console.WriteLine("Property named {0} has type {1}", property.Name, property.PropertyType);
if (property.PropertyType == typeof(string))
{
var textBox = new TextBox();
var binding = new Binding();
binding.Source = request;
binding.Path = new PropertyPath(property.Name);
BindingOperations.SetBinding(textBox, TextBox.TextProperty, binding);
stackPanel.Children.Add(textBox);
}
// etc for other types you care about
}
window.ShowDialog();
Console.WriteLine("Airline is now {0}",request.Airline);
Console.WriteLine("Finished");
}
}
class TripRequest
{
public string Airline { get; set; }
public int Price { get; set; }
}