使用反射填充GUI以创建规则



我想创建一个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; }
}

相关内容

  • 没有找到相关文章