C#泛型:我可以在这个例子中使用它们吗?
如何使用泛型实现这一点 在我当前的代码中,我正在为车辆上的每个功能编写类似的代码C#泛型:我可以在这个例子中使用它们吗?,c#,.net,generics,.net-4.0,C#,.net,Generics,.net 4.0,如何使用泛型实现这一点 在我当前的代码中,我正在为车辆上的每个功能编写类似的代码 foreach (var vaudioSystem in VehicleAudioSystem) { var acMl = (VOVehicleFeatureList) FrameworkFactoryApi.CreateVO(typeof (VOVehicleFeatureList)); acMl.IsInitialized = fa
foreach (var vaudioSystem in VehicleAudioSystem)
{
var acMl = (VOVehicleFeatureList) FrameworkFactoryApi.CreateVO(typeof (VOVehicleFeatureList));
acMl.IsInitialized = false;
acMl.Initialize(true);
acMl.VehicleFeatureListType = GlobalEnums.VehicleFeatureListType.AudioSystem;
acMl.ValueId = vaudioSystem;
vehicleSpec.VehicleFeatureLists.Add(acMl);
}
foreach(var axle in VehicleAxles)
{
var acMl =
(VOVehicleFeatureList)FrameworkFactoryApi.CreateVO(typeof(VOVehicleFeatureList));
acMl.IsInitialized = false;
acMl.Initialize(true);
acMl.VehicleFeatureListType = GlobalEnums.VehicleFeatureListType.Axles;
acMl.ValueId = axle;
vehicleSpec.VehicleFeatureLists.Add(acMl);
}
foreach(var nav in VehicleNavSystem)
{
var acMl =
(VOVehicleFeatureList)FrameworkFactoryApi.CreateVO(typeof(VOVehicleFeatureList));
acMl.IsInitialized = false;
acMl.Initialize(true);
acMl.VehicleFeatureListType = GlobalEnums.VehicleFeatureListType.NavSystem;
acMl.ValueId = nav;
vehicleSpec.VehicleFeatureLists.Add(acMl);
}
是否有某种方法可以使用泛型来缩短此代码的长度,或者是我找错了方向?您只需编写一个方法,将车辆功能添加到您的车辆规格中即可
public void AddVehiculeFeatures(IEnumerable<int> featureList, GlobalEnums.VehicleFeatureListType listType, Vehicle vehicleSpec)
{
foreach(int feature in featureList)
{
var acMl = (VOVehicleFeatureList)FrameworkFactoryApi.CreateVO(typeof(VOVehicleFeatureList));
acMl.IsInitialized = false;
acMl.Initialize(true);
acMl.VehicleFeatureListType = listType;
acMl.ValueId = nav;
vehicleSpec.VehicleFeatureLists.Add(acMl);
}
}
您只需编写一个方法,将车辆功能添加到vehiclespec
public void AddVehiculeFeatures(IEnumerable<int> featureList, GlobalEnums.VehicleFeatureListType listType, Vehicle vehicleSpec)
{
foreach(int feature in featureList)
{
var acMl = (VOVehicleFeatureList)FrameworkFactoryApi.CreateVO(typeof(VOVehicleFeatureList));
acMl.IsInitialized = false;
acMl.Initialize(true);
acMl.VehicleFeatureListType = listType;
acMl.ValueId = nav;
vehicleSpec.VehicleFeatureLists.Add(acMl);
}
}
您可以添加一个函数,该函数接受列表和枚举值,然后调用它三次
protected void AddFeaturesFromlist(List<int> featureList, GlobalEnums.VehicleFeatureListType type)
{
foreach(var item in featureList)
{
var acMl =(VOVehicleFeatureList)FrameworkFactoryApi.CreateVO(typeof(VOVehicleFeatureList));
acMl.IsInitialized = false;
acMl.Initialize(true);
acMl.VehicleFeatureListType = type;
acMl.ValueId = item;
vehicleSpec.VehicleFeatureLists.Add(acMl);
}
}
AddFeaturesFromlist(VehicleAudioSystem, GlobalEnums.VehicleFeatureListType.AudioSystem);
...
protectedvoid AddFeaturesFromlist(列表featureList,GlobalEnums.VehicleFeatureListType)
{
foreach(特性列表中的变量项)
{
var acMl=(VOVehicleFeatureList)FrameworkFactoryApi.CreateVO(typeof(VOVehicleFeatureList));
acMl.i初始化=假;
初始化(true);
acMl.VehicleFeatureListType=类型;
acMl.ValueId=项目;
车辆规格。车辆特征列表。添加(acMl);
}
}
添加来自列表的功能(车辆音频系统、GlobalEnums.VehicleFeatureListType.AudioSystem);
...
您可以添加一个函数,该函数获取列表和枚举值,然后调用它三次
protected void AddFeaturesFromlist(List<int> featureList, GlobalEnums.VehicleFeatureListType type)
{
foreach(var item in featureList)
{
var acMl =(VOVehicleFeatureList)FrameworkFactoryApi.CreateVO(typeof(VOVehicleFeatureList));
acMl.IsInitialized = false;
acMl.Initialize(true);
acMl.VehicleFeatureListType = type;
acMl.ValueId = item;
vehicleSpec.VehicleFeatureLists.Add(acMl);
}
}
AddFeaturesFromlist(VehicleAudioSystem, GlobalEnums.VehicleFeatureListType.AudioSystem);
...
protectedvoid AddFeaturesFromlist(列表featureList,GlobalEnums.VehicleFeatureListType)
{
foreach(特性列表中的变量项)
{
var acMl=(VOVehicleFeatureList)FrameworkFactoryApi.CreateVO(typeof(VOVehicleFeatureList));
acMl.i初始化=假;
初始化(true);
acMl.VehicleFeatureListType=类型;
acMl.ValueId=项目;
车辆规格。车辆特征列表。添加(acMl);
}
}
添加来自列表的功能(车辆音频系统、GlobalEnums.VehicleFeatureListType.AudioSystem);
...
可能不是泛型,但通过一点方法重构,您当然可以使其更加优雅。您正在重复大量代码,因此请尽量减少这种情况
foreach (var vaudioSystem in VehicleAudioSystem)
AddFeature(vaudioSystem, GlobalEnums.VehicleFeatureListType.AudioSystem);
foreach(var axle in VehicleAxles)
AddFeature(axle, GlobalEnums.VehicleFeatureListType.Axles);
foreach(var nav in VehicleNavSystem)
AddFeature(nav, GlobalEnums.VehicleFeatureListType.NavSystem);
[...]
public static void AddFeature(int id, VehicleFeatureListType type)
{
var acMl = (VOVehicleFeatureList)FrameworkFactoryApi.CreateVO(
typeof(VOVehicleFeatureList));
acMl.IsInitialized = false;
acMl.Initialize(true);
acMl.VehicleFeatureListType = type;
acMl.ValueId = id;
vehicleSpec.VehicleFeatureLists.Add(acMl);
}
也许不是泛型,但您当然可以通过一点方法重构使其更优雅。您正在重复大量代码,因此请尽量减少这种情况
foreach (var vaudioSystem in VehicleAudioSystem)
AddFeature(vaudioSystem, GlobalEnums.VehicleFeatureListType.AudioSystem);
foreach(var axle in VehicleAxles)
AddFeature(axle, GlobalEnums.VehicleFeatureListType.Axles);
foreach(var nav in VehicleNavSystem)
AddFeature(nav, GlobalEnums.VehicleFeatureListType.NavSystem);
[...]
public static void AddFeature(int id, VehicleFeatureListType type)
{
var acMl = (VOVehicleFeatureList)FrameworkFactoryApi.CreateVO(
typeof(VOVehicleFeatureList));
acMl.IsInitialized = false;
acMl.Initialize(true);
acMl.VehicleFeatureListType = type;
acMl.ValueId = id;
vehicleSpec.VehicleFeatureLists.Add(acMl);
}
如果您真的想使用泛型,这里有一个版本使用LINQ:)
如果您真的想使用泛型,这里有一个版本使用LINQ:)
通用解决方案: 首先,创建一个名为VehicleFeature的类,如下所示:
public class VehicleFeature
{
public int ValueId;
public GlobalEnums.VehicleFeatureListType VehicleFeatureListType;
public VehicleFeature(int valueId, GlobalEnums.VehicleFeatureListType vehicleFeatureListType)
{
this.ValueId = valueId;
this.VehicleFeatureListType = vehicleFeatureListType;
}
}
然后,创建名为VehicleFeatureList的类,该类继承以下列表:
public class VehicleFeatureList : List<VehicleFeature>
{
public GlobalEnums.VehicleFeatureListType VehicleFeatureListType { get; set; }
private List<VehicleFeature> values;
public List<VehicleFeature> Values
{
get { return values; }
set { values = value; }
}
public void Add(int ValueId)
{
this.values.Add(new VehicleFeature(ValueId, this.VehicleFeatureListType));
}
public void AddRange(int[] values)
{
foreach (int item in values)
{
this.Add(item);
}
}
public VehicleFeatureList(GlobalEnums.VehicleFeatureListType vehicleFeatureListType)
{
this.VehicleFeatureListType = vehicleFeatureListType;
}
}
您可以向变量添加如下值:
VehicleAxles.Add(5);
AddToVehicleFeatureList(VehicleAudioSystem);
如果要在同一类型中添加不同的值,可以执行以下操作:
VehicleAudioSystem.AddRange(new int[] {1,5,6,9});
然后,您就有了这个独特的功能,可以为您想要的任何功能工作:
private void AddToVehicleFeatureList<T>(T VehicleParameterType)
where T : VehicleFeatureList
{
foreach (var item in VehicleParameterType)
{
var acMl =
(VOVehicleFeatureList)FrameworkFactoryApi.CreateVO(typeof(VOVehicleFeatureList));
acMl.IsInitialized = false;
acMl.Initialize(true);
acMl.VehicleFeatureListType = item.VehicleFeatureListType;
acMl.ValueId = item.ValueId;
vehicleSpec.VehicleFeatureLists.Add(acMl);
}
}
您可以在GlobalEnums.VehicleFeatureListType中添加所需的任何要素类型,该代码仍然有效。
问候语通用解决方案: 首先,创建一个名为VehicleFeature的类,如下所示:
public class VehicleFeature
{
public int ValueId;
public GlobalEnums.VehicleFeatureListType VehicleFeatureListType;
public VehicleFeature(int valueId, GlobalEnums.VehicleFeatureListType vehicleFeatureListType)
{
this.ValueId = valueId;
this.VehicleFeatureListType = vehicleFeatureListType;
}
}
然后,创建名为VehicleFeatureList的类,该类继承以下列表:
public class VehicleFeatureList : List<VehicleFeature>
{
public GlobalEnums.VehicleFeatureListType VehicleFeatureListType { get; set; }
private List<VehicleFeature> values;
public List<VehicleFeature> Values
{
get { return values; }
set { values = value; }
}
public void Add(int ValueId)
{
this.values.Add(new VehicleFeature(ValueId, this.VehicleFeatureListType));
}
public void AddRange(int[] values)
{
foreach (int item in values)
{
this.Add(item);
}
}
public VehicleFeatureList(GlobalEnums.VehicleFeatureListType vehicleFeatureListType)
{
this.VehicleFeatureListType = vehicleFeatureListType;
}
}
您可以向变量添加如下值:
VehicleAxles.Add(5);
AddToVehicleFeatureList(VehicleAudioSystem);
如果要在同一类型中添加不同的值,可以执行以下操作:
VehicleAudioSystem.AddRange(new int[] {1,5,6,9});
然后,您就有了这个独特的功能,可以为您想要的任何功能工作:
private void AddToVehicleFeatureList<T>(T VehicleParameterType)
where T : VehicleFeatureList
{
foreach (var item in VehicleParameterType)
{
var acMl =
(VOVehicleFeatureList)FrameworkFactoryApi.CreateVO(typeof(VOVehicleFeatureList));
acMl.IsInitialized = false;
acMl.Initialize(true);
acMl.VehicleFeatureListType = item.VehicleFeatureListType;
acMl.ValueId = item.ValueId;
vehicleSpec.VehicleFeatureLists.Add(acMl);
}
}
您可以在GlobalEnums.VehicleFeatureListType中添加所需的任何要素类型,该代码仍然有效。
问候语VehicleAudioSystem、VehicleAxles和VehicleAvSystem是否派生自公共基类?VehicleAudioSystem/VehicleAxles和VehicleAvSystem是我创建的集合。它们是整数列表。VehicleAudioSystem、VehicleAxles和VehicleAvSystem是否派生自公共基类?VehicleAudioSystem/VehicleAxles和VehicleAvSystem是我创建的集合。它们是整数的列表。我正在尝试这个。Thx的解决方案我正在尝试这个。泰铢solution@fantasticfix:嗯,它不使用泛型,但它完成了相同的事情,消除了相同代码的重复。我不是说它不工作-->而是说它的标题是“如果你真的想使用泛型…”。不,它不使用泛型;-)@fantasticfix:它不声明任何泛型类型或方法,但它确实使用它们(
Select
和Concat
)。@fantasticfix:它不使用泛型,但它完成了同样的事情,消除了相同代码的重复。我不说它不工作-->但标题是“如果你真的想使用泛型…”我不得不说。不,它不使用泛型;-)@fantasticfix:它没有声明任何泛型类型或方法,但肯定会使用它们(Select
和Concat
)。您好,谢谢您的回复。我使用了FantasticFix建议的解决方案您好,不客气。他的解决方案确实不错,而且比我的快得多。您好,谢谢您的回复。我使用了FantasticFix建议的解决方案您好,不客气。他的解决方案确实很好,而且比我的快得多。