【问题标题】:How construct a Type, To hold two 'types' of data , to be sent As a Single Parameter如何构造一个类型,保存两种“类型”的数据,作为单个参数发送
【发布时间】:2021-04-30 03:50:45
【问题描述】:

我需要实现这种方法——将两种数据作为一组参数发送到一个单个Type——这样一种类型就可以保存这两个参数。这样我就可以将Type 传递给某种方法进行处理。

第一个数据项是:

  • 要显示的列,命名为:displayed

第二个数据项:

  • 该列displayed 的副本(或仅一部分),因为它具有相同的来源,所以只有这些列不会显示...换句话说,要省略的列,所以我将其命名为:omitted

两者都是我命名的列类型 - SelectedColumns

public class SelectedcColoumns
{
    public enum renederingMode
    {
        Displayed,
        omitted
    }
    public class omitted
    {

    }
    public class displayed
    {
    }
}

因为要显示该 SetOfColumns 的请求是通过选择表名来完成的。所以作为要显示的数据的 Column 类会根据用户的选择而有所不同

public class tableNames
{
   public static readonly string tblCustomers = "tblCustomers";
   public static readonly string tblProducts = "tblProducts";
}

public class TblColumns
{
    public class tblCustomers
    {
        public const string custID = "custID",
                            Name = "Name",
                            Phone = "Phone";
                            Email = "Email";
  
    }
    public class tblProducts 
    {
        public const string PrudctID = "PrudctID ",
                            PrudctName = "PrudctID",
                            PrudctCategory = "PrudctCategory";
    }
    ...etc'

}

当用户从任何表中选择一组表列......在这个例子中......选择CustomersProducts列(例如SelectedColumns - 是tblCustomers列),我然后需要有另一个列表,这些列表是用户选择从所有可用表列中省略(不显示)的列表。

假设用户选择将 Table Customers 作为表。他选择省略tblCustomers.custID + tblCustomer.Email,因为他只需要显示姓名和电话。

我遇到的问题是在我可以访问这些参数时(表名+要省略的列),我如何将它发送到进程(将其作为一个参数传递)?这就是为什么我创建了一个专门的类,将这个Type 作为发送参数:all columns + omitted Columns 合二为一。

这是我目前卡住的地方;我需要知道如何使用它来构建/构造用户选择的参数。

public class SelectedColoumns
{
    public enum renederingMode
    {
        Displayed,
        omitted
    }
        public class omitted
        {
           List<string> omitCols_ListStr = new List<string>();
        }
       
        public class displayed
        {
           List<string> dispCols_ListStr = new List<string>();
        }
}

在这一部分中,我通过reflection作为数据的提供者检索列列表,通过以下方法:

通过嵌套的class-name 获取任何嵌套类字段,如List&lt;string&gt;,它是父级 - Type

public static List<string> anyNestedClassFiledsAsListByType<ClassToReturnOneOfitsNested_Fields>(string NetedClassName)
 {
                var RetNestedClassFildsListValues = typeof(ClassToReturnOneOFitsNested).GetNestedTypes()
                    .First(t => String.Compare(t.Name, NetedClassName, true) == 0).GetFields(BindingFlags.Public | BindingFlags.Static)
                    .Where(f => f.FieldType == typeof(string)).Select(f => (string)f.GetValue(null)).ToList();
                return RetNestedClassFildsListValues;
            }

所以要产生这个我可以使用上面的方法就像那样

var TableColumns_ALL = 
anyNestedClassFldsAsListByType<TblColumns>(tableNames.tblCustomers);

我的问题与需要发送 TableColumns_ALL + 选择的列以省略然后由下面的renderSelectedTable() 处理的类有关。

所以它比反射的复杂性更基本,但仍然有些我不知道 popper 的构造方式,SelectedColumns class,所以它将适应和格式化这个将被发送的新数据类型的结构作为参数,方法是这样的。

public void renderSelectedTable(SelectedColoumns CurrentUserSelectedCols)
{
    StringBuilder NwTRLoopSB = new StringBuilder();

    string curRowStyle= string.Empty,
           nwLine = Environment.NewLine + "\t\t\t",
           BaseTemplateTD = string.Empty;

    NwTRLoopSB.Append(
            string.Format(
                "<table id='tbl_Settings' cellspacing='0' border='1'><tr id='TR_headers'{0}>{1}",
                curRowStyle,
                nwLine
                )._Dhtml_DoubleQoutes()
        );
    foreach (var Item in SelectedListStr.Select((Val, counter) => new { Value = Val, Index = counter }))
    {
            curRowStyle = Lsts.DynamicStyle_Generator(Item.Index);

            if(Lsts.ExcludeColumns(Item.Value, OmittedCols))
            {
                BaseTemplateTD = string.Format("<td>{0}</td>{1}", Item.Value, nwLine)._Dhtml_DoubleQoutes();
                NwTRLoopSB.Append(BaseTemplateTD);
            }    
      
    }///ENd TR cells generator Section

    NwTRLoopSB.Append("</tr></table>");
    return NwTRLoopSB.ToString();

}

【问题讨论】:

    标签: c# class optimization types


    【解决方案1】:

    我会这样处理:

    public class Column{
        public string Name { get; set; }
        public bool Visible { get; set; }
    }
    
    public class Grid{
        public List<Column> Columns { get; set; }
    }
    

    因此,我可以轻松地定义包含可见或省略列的完整表。 在 OP 的示例中:

    public class SelectedColumns
    {
        //instead of the enum you would have boolean in the column type "Visible" (whether is shown or not)
        public enum renederingMode
        {
            Displayed,
            omitted
        }
        // instead of both these you would have a List o Column types that have a name AND a boolean, so you have your List<string> and a boolean to indicate whether it is visible or ommited. Well at least that's how I understood it.
        public class ommited
        {
    
        }
        public class displayed
        {
        }
    }
    

    【讨论】:

    • 请再多一点,会给你额外的 10' 那个(:实施或这种方法缺少什么,所以我可以在我们开玩笑的时候真正学习..谢谢队友跨度>
    • 你没看错,我需要发List&lt;all&gt; + List&lt;omitted&gt; 或者你可以这样说List&lt;all&gt; + (-List&lt;omitted&gt;),我最近学的一个新词( :下次我会尝试在我的问题中省略几行文字(;
    【解决方案2】:

    所以.. 首先.. 一个设计说明:给定一个列列表.. 您将显示一列,或者不显示一列.. 没有其他涉及可见性的选项。因此,您实际上只需要传入要显示的列或要省略的列的单个列表 - 但不能同时传递两者。

    如果您选择进行该修改,则只需传入一个 List&lt;string&gt;

    如果您选择保留当前设计,那么您将需要一个包含两个 properties 的类:

    public class SelectedColumns {
        public List<string> displayed { get; set; }
        public List<string> omitted { get; set; }
    }
    

    【讨论】:

    • 感谢您的回答,正如您所见,在推动自己提出新想法时,我有时会错过显而易见的事情。它确实适用于单个传递的列列表,但我已将其与方法本身中的另一个列表进行排序,我希望将其清理为正确的代码,以便我可以从专业开发人员那里举个例子。
    • 顺便问一下什么是 TLDR (:
    • 你很快Povilasp!我在谷歌上查了一下,你花了 23 秒才这么说
    • 我在下面写了一个答案并且已经知道它的含义 - 可能是因为我得到了很多:D
    • 我不妨使用你的方法......因为我没有被清除出如何处理用户的 UI 请求以自动在线处理以供下一阶段使用的阶段,因为它是UI 项目制作了一种我自己的 GridView 版本,它的设置是通过 Webforms 方法而不是 Visual Studio 进行的,因此您可以 DIY 您的报告而无需 .net 知识
    猜你喜欢
    • 1970-01-01
    • 2012-05-28
    • 2022-01-25
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多