Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取列表的现有实例<;T>;_C#_.net_.net 4.5 - Fatal编程技术网

C# 获取列表的现有实例<;T>;

C# 获取列表的现有实例<;T>;,c#,.net,.net-4.5,C#,.net,.net 4.5,我继承了一个臃肿的项目,它使用一个巨大的类作为内存中的数据库: public class Database { public class Parameter1 { public string Code { get; set; } public string Label { get; set; } public List<Parameter1Value> paramValues; } public cla

我继承了一个臃肿的项目,它使用一个巨大的类作为内存中的数据库:

public class Database
{
    public class Parameter1
    {
        public string Code { get; set; }
        public string Label { get; set; }
        public List<Parameter1Value> paramValues;
    }

    public class Parameter2
    {
        public string Code { get; set; }
        public string Label { get; set; }
        public List<Parameter2Value> paramValues;
    }

    public class Parameter1Value
    {
        public string Value { get; set;}
        public Parameter parameter { get; set;}
    }

    public class Parameter2Value
    {
        public int Value { get; set;}
        public Parameter2 parameter { get; set;}
    }

    public List<Parameter1> parameter1List { get; set; }
    public List<Parameter2> parameter2List { get; set; }
}
公共类数据库
{
公共类参数1
{
公共字符串代码{get;set;}
公共字符串标签{get;set;}
公共价值清单;
}
公共类参数2
{
公共字符串代码{get;set;}
公共字符串标签{get;set;}
公共价值清单;
}
公共类参数1值
{
公共字符串值{get;set;}
公共参数{get;set;}
}
公共类参数2value
{
公共int值{get;set;}
公共参数2参数{get;set;}
}
公共列表参数1列表{get;set;}
公共列表参数2List{get;set;}
}
我正在创建一个泛型方法,该方法创建Parameter1或Parameter2(见下文)的实例,并应将其添加到各自的列表中,但我不知道如何使用这些类型从数据库类中获取parameter1List或parameter2List实例。对于每个定义的类型,数据库类只保存一个List
属性。这可能吗

这是用于创建实例的通用方法:

public static Database Add<T>(this Database database, string code, string label) where T : new()
{
    T itemToCreate = (T)Activator.CreateInstance(typeof(T));
    itemToCreate.Code = code;
    itemToCreate.Label = label;
    var listForItem = database.GetList<T>; // This is the missing functionality
    listForItem.Add(itemToCreate);
    return database;
}
公共静态数据库添加(此数据库、字符串代码、字符串标签),其中T:new()
{
T itemToCreate=(T)Activator.CreateInstance(typeof(T));
itemToCreate.Code=代码;
itemToCreate.Label=标签;
var listForItem=database.GetList;//这是缺少的功能
listForItem.Add(itemToCreate);
返回数据库;
}

这是一个使用接口和通用约束的解决方案

创建表示泛型参数类的接口,并根据需要向接口添加成员:

public interface IParameter { ... }
以及表示参数列表的接口:

public interface IParameterList<TParameter> where TParameter : IParameter
{
    List<TParameter> ParameterList { get; set; }
}
where TParameter:ipParameter
约束添加到泛型参数factory函数中,并使factory函数需要类型为
ipParameterList
的参数,该参数是
数据库
类的实例。这使编译器确信
数据库
类拥有一个
t参数列表
。现在我们只需执行
db.ParameterList.Add(r)
即可将新参数添加到正确的列表中

public static TParameter CreateParameter<TParameter>(IParameterList<TParameter> db) where TParameter : IParameter, new()
{
    var r = new TParameter(); // This is the generic function you mentioned. Do stuff here to create your Parameter class.
    db.ParameterList.Add(r); // Add the newly created parameter to the correct list
    return r;
}
公共静态TpaParameter CreateParameter(IpaParameterList db),其中TpaParameter:IpaParameter,new()
{
var r=new TParameter();//这是您提到的通用函数。请在此处执行操作以创建您的参数类。
db.ParameterList.Add(r);//将新创建的参数添加到正确的列表中
返回r;
}

代码转储(在我选择添加了通用工厂功能的编辑后的完整工作版本):

公共类参数1:IPParameter
{
公共字符串代码{get;set;}
公共字符串标签{get;set;}
公共价值清单;
}
公共类参数2:IPParameter
{
公共字符串代码{get;set;}
公共字符串标签{get;set;}
公共价值清单;
}
公共类参数1值
{
公共字符串值{get;set;}
公共参数{get;set;}
}
公共类参数2value
{
公共int值{get;set;}
公共参数2参数{get;set;}
}
公共类数据库:IPParameterList,IPParameterList
{
//注意:列表属性的setter在这里或iPareterList中可能不需要,因为在下面的代码中,我们在类构造时实例化了它们,至少在这个MCVE中,没有进一步的赋值
公共列表参数1list{get;set;}=new List();
公共列表参数2list{get;set;}=new List();
List IPParameterList.ParameterList{get=>parameter1List;set=>parameter1List=value;}
List IPParameterList.ParameterList{get=>parameter2List;set=>parameter2List=value;}
公共静态TpaParameter添加(IpaParameterList db,字符串代码,字符串标签),其中TpaParameter:IpaParameter,new()
{
var itemToCreate=新的TParameter();
itemToCreate.Code=代码;
itemToCreate.Label=标签;
db.ParameterList.Add(itemToCreate);//将新创建的参数添加到正确的列表中
返回itemToCreate;
}
}
公共接口参数
{
字符串代码{get;set;}
字符串标签{get;set;}
}
公共接口IPParameter列表,其中tpParameter:IPParameter
{
列表参数列表{get;set;}
}
//测试:
void Main()
{
var db=新数据库();
添加(db,“hello”,“hello2”);
添加(db,“hello”,“hello2”);
添加(db,“hello”,“hello2”);
WriteLine($“P1计数(应该是2):{db.parameter1List.count()};P2计数(应该是1):{db.parameter2List.count}”);
}
输出:

P1计数(应为2):2;P2计数(应为1):1


下面是一个使用接口和通用约束的解决方案

创建表示泛型参数类的接口,并根据需要向接口添加成员:

public interface IParameter { ... }
以及表示参数列表的接口:

public interface IParameterList<TParameter> where TParameter : IParameter
{
    List<TParameter> ParameterList { get; set; }
}
where TParameter:ipParameter
约束添加到泛型参数factory函数中,并使factory函数需要类型为
ipParameterList
的参数,该参数是
数据库
类的实例。这使编译器确信
数据库
类拥有一个
t参数列表
。现在我们只需执行
db.ParameterList.Add(r)
即可将新参数添加到正确的列表中

public static TParameter CreateParameter<TParameter>(IParameterList<TParameter> db) where TParameter : IParameter, new()
{
    var r = new TParameter(); // This is the generic function you mentioned. Do stuff here to create your Parameter class.
    db.ParameterList.Add(r); // Add the newly created parameter to the correct list
    return r;
}
公共静态TpaParameter CreateParameter(IpaParameterList db),其中TpaParameter:IpaParameter,new()
{
var r=new TParameter();//这是您提到的通用函数。请在此处执行操作以创建您的参数类。
db.ParameterList.Add(r);//将新创建的参数添加到正确的列表中
返回r;
}

代码转储(完整的工作版本后,我拿起你的编辑,增加了通用工厂的乐趣