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;
}
代码转储(完整的工作版本后,我拿起你的编辑,增加了通用工厂的乐趣