首页 > 解决方案 > 如何通过类实例返回引用?

问题描述

我正在尝试构建一个通用的自定义选择器表单。根据类构造函数,它应该返回单个值或值列表。

public partial class DGV_Select_Multiple : Form
{
    public bool Answered { get; set; } = false; // Indicates if user picked something
    public string Result { get; set; } = ""; // Single picked result
    public List<string> Result_List { get; set; } = new List<string>(); // Multiple picked results
    public List<string> Default_List { get; set; } = new List<string>(); // Default highlighted values

    private bool MultipleSelection { get; set; } = false; // Flag of single/multiple selection allowed

    public DGV_Select_Multiple(IEnumerable<string> List, string Default)
    {
        // Default value is a single string => single selection available only
        InitializeComponent();
        this.MultipleSelection = false;
        this.Default_List = new List<string> { Default };
        
        b_confirm.Click += delegate { ConfirmSelection(); };
        b_cancel.Click += delegate { this.Close(); };
    }

    public DGV_Select_Multiple(IEnumerable<string> List, List<string> Default_List)
    {
        // Default is a List<string> => multiple selections are available
        InitializeComponent();
        this.MultipleSelection = true;
        this.Default_List = Default_List;
        b_confirm.Click += delegate { ConfirmSelection(); };
        b_cancel.Click += delegate { this.Close(); };
    }

    private void ConfirmSelection()
    {
        this.Answered = true;
        if (MultipleSelection)
        {
            Result_List = new List<string> { "value1", "value2" };
        }
        else
        {
            Result = "some single string";
        }
    }
}

类的返回值我每次都需要使用这样的冗余操作:

bool Answered = false;
string Result = "";
var AskForm = new DGV_Select_Multiple(new List<string> { "v1", "v2" }, "");
AskForm.Show();

if (AskForm.Answered)
{
   Result = AskForm.Result;
}

我尝试在类构造函数中使用ref 字符串,但它最终没有改变。有什么办法可以简化上面的构造函数?

string Result = new DGV_Select_Multiple(new List<string> { "v1", "v2" }, "").Result;

或类似的东西。任何帮助表示赞赏

标签: c#forms

解决方案


将逻辑移动到静态工厂方法中。由于您有两种返回类型,因此您需要两种方法,但它们可以具有相同的名称。

class DGV_Select_Multiple
{
    public static List<string> Show(List<string> list, List<string> defaultList)
    {
        var f = New DGV_Select_Multiple(list, defaultList);
        f.Show();

        return f.Answered ? f.Result as string : null;
    }

    public static string Show(List<string> list, string defaultString)
    {
        var f = New DGV_Select_Multiple(list, defaultString);
        f.Show();

        return f.Answered ? f.Result as List<string> : null;
    }

    //Etc....

现在,当您需要使用表单时,您所要做的就是编写:

string result= DGV_Select_Multiple.Show(new List<string> { "v1", "v2" }, "");

或者

List<string> result= DGV_Select_Multiple.Show(new List<string> { "v1", "v2" }, new List<string> { "" });

推荐阅读