2

我正在尝试制作一个包含文本框和“浏览”按钮的用户控件,它将打开一个文件对话框并使用选择更新文本框(如 HTML 文件上传框)。虽然我希望将所选文件属性映射到文本框,但我希望文件对话框的几乎所有其他属性都可以从我的控件(过滤器等)中公开使用

我的2个问题:

  1. 对于直接映射到其中一个内部控件的属性的控件的属性,是否有一些快捷方式(在语言或 VS IDE 中)可以轻松完成此操作,而无需手动编写get/set对并将单行添加到每个返回/设置相应的属性?
  2. 是否有某种方法(语言或 IDE 快捷方式)可以为多个属性执行上述操作?基本上我希望我的控件具有文件对话框的所有属性。
4

2 回答 2

3

这听起来像是 T4 的工作!

您可以使用 T4 和反射来创建一个包含所有这些属性的部分类。如果它只有一个类,那么它可能比手动完成更多工作;我想你需要决定你想要使用它的频率。

编辑:

T4 表示:文本模板转换工具包

它内置于 Visual Studio 中,允许您编写模板,为您生成代码。
当您需要编写任何类型的重复或样板代码时,它会很有用。

我已经为你做了一个开始。在您的解决方案中创建一个名为 MyUserControl.tt 的新文件并复制下面的代码。
保存后,将出现一个名为 MyUserControl.cs 的新文件并列出所有属性。

由于这会生成一个部分类,因此您需要调整类名和命名空间以匹配现有用户控件的名称。我假设您的文本框的名称是 Target,但您显然也可以这样做。

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Web" #>
<#@ import namespace="System.Reflection" #> 

public partial class MyUserControl
{
<#
PropertyInfo[] properties = typeof(System.Web.UI.WebControls.TextBox).GetProperties(
    BindingFlags.Public | BindingFlags.Instance);

foreach (PropertyInfo property in properties)
{
    WriteLine(string.Format("    public {0} {1}", property.PropertyType.FullName, property.Name));
    WriteLine("    {");

    if(property.GetGetMethod() != null)
    {
        WriteLine("        get { return Target." + property.Name + "; } ");
    }

    if(property.GetSetMethod() != null)
    {
        WriteLine("        set { Target." + property.Name + " = value; } ");
    }

    WriteLine("    }");
    WriteLine("");
}

#>
}
于 2012-09-20T14:07:44.490 回答
1

您可以使用 ReSharper 执行此操作。
假设以下类:

public class YourUserControl
{
    private OpenFileDialog _openFileDialog;
    private TextBox _textBox;
}

您可以将光标放在班级内并按 Alt+Ins 并选择“委派成员”。这将为您提供这两个领域的所有公共成员的列表。你可以选择你需要的,然后你是:

在此处输入图像描述

于 2012-09-20T11:30:31.403 回答