【问题标题】:Select which jobject to load from argument从参数中选择要加载的作业
【发布时间】:2019-04-09 23:14:56
【问题描述】:

我觉得这应该是我脑海中浮现的东西,但我想不出一种方法可以在数十个 if 语句之外加载正确的数据。

我有一堆这样的文件:

public static class TableDemo
{
    public static dynamic TableDef() { 
        var json = @"{
                    'date': {
                    'StartingPosition': 5,
                    'ColumnWidth': 7,
                    'DataType': 'Date'
                     };"

        dynamic newJson = JsonConvert.SerializeObject(json);
        dynamic TableJson = JObject.Parse(json);
        return TableJson;
   }
}

每个文件都描述了我正在加载的不同平面文件。当我去加载它时,我希望使用我传入的参数使用标准化函数将所有内容加载到数据表中。这是我的工作示例:

public static DataTable ParseTable()
{
   JObject data = TableDefinitions.TableDemo.TableDef();
   ... do stuff with data ...
}

我希望能够传入这样的参数:

public static DataTable ParseTable(string LoadTable)
{
   JObject data = TableDefinitions.LoadTable.TableDef();
   ... do stuff with data ...
}

使用类似的方法调用函数:

ParseTable("Users");

由于我将拥有数百个文件,如果没有大量像这样的 if 语句,我该怎么做:

if(LoadTable =="Users"){
       JObject data = TableDefinitions.Users.TableDef();
}else if(LoadTable =="Employees"){
       JObject data = TableDefinitions.Employees.TableDef();
}

【问题讨论】:

  • 您可以使用Dictionary<string, JObject> 简化if 语句,其中键是表(“Users”、“Employees”...),值是对应的JObjectTableDefinitions.Users.TableDef()等)
  • 我不知道你的情况,但你确定,你没有重新发明 JsonConvert.Deserialize() 所做的事情吗?
  • @ChristophLütjen 我用过JsonConvert.DeserializeObject<RootObject>(jsonString),但我会调查你的方式。

标签: c# .net function functional-programming


【解决方案1】:

这可以使用反射来解决。

您的代码应该如下所示:

interface ITableDef
{
    JObject TableDef();
}

class UserCollection : ITableDef
{
   // Stuff
   public JObject TableDef(){ // Todo }
}

class EmployeeCollection : ITableDef
{
   // Stuff
   public JObject TableDef(){ // Todo }
}

class TableDefinitions
{
  public UserCollection Users {get;set;}
  public EmployeeCollection Employees {get;set;}
  // Stuff
}

public JObject RunTableDefMethod(TableDefinitions tableDefinitionsInstance, string propertyName)
{
    var propInfo = typeof(TableDefinitions).GetProperty(propertyName); // you can cache this
    var instance = propInfo.GetValue(tableDefinitionsInstance) as ITableDef;
    return instance.TableDef();
}

【讨论】:

  • 这看起来很有希望,但是 RunTableDefMethod 需要返回 JObject 以便我可以在外部使用它。我尝试切换返回类型,但不知道如何调用它。 RunTableDefMethod(Users, "TableDef") 不起作用
  • var jobj = RunTableDefMethod(TableDefinitions, "Users");
  • @AmirPopovich 您需要更改您的RunTableDefMethod 以返回JObject 的实例
猜你喜欢
  • 2015-04-30
  • 2021-01-15
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多