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建议的解决方案您好,不客气。他的解决方案确实很好,而且比我的快得多。