更新List <t>的特定列

时间:2017-11-23 15:41:09

标签: c# asp.net .net

首先,他们原谅我的英语,因为它不是我的母语。 我有一个接收通用列表List<T>的方法。我想要的是通过整个列表进行预测,并能够更新一个名为Eliminated of each class T的列,它是布尔类型的,是否可以这样做?任何人都可以帮助我。

这是我到目前为止所做的:

// Delete (Change status delete = true)
public void Delete<T>(List<T> data)
{      
    if (data != null)
    {
        data.ForEach(x =>
        {
           ...
        });
    }           
}

提前致谢!

3 个答案:

答案 0 :(得分:12)

而不是T我会使用界面,因为在foreach中你无法访问属性Eliminated

这里是界面:

interface IExample {

    bool IsEliminated { get; set; }    

}

这里是ForEach循环的方法。

public void Delete<T>(List<T> data) where T : IExample
{      
    if (data != null)
    {
        data.ForEach(x =>
        {
           x.Eliminated = true;
        });
    }           
}

答案 1 :(得分:4)

如果您想要一个通用方法来更新任何类型的列表,您可以这样做:

public void Update<T>(List<T> data, Action<T> func)
{
    if (data == null)
        throw new ArgumentNullException(nameof(data));

    data.ForEach(func);
}

注意如果传入空列表,我会将null检查更改为throw。你可以回到这里,这样就省去了一些嵌套。

这允许您传递应用于集合中每个项目的操作。你可以这样使用它:

var data = new List<YourClass> = GetData();

Update(data, item => item.Eliminated = true);

答案 2 :(得分:3)

您的T没有名为Eliminated的媒体资源。您的编译器无法保证您将使用此方法的任何 T将具有该成员,因此您不允许以这种方式编译它。

您可以在T上设置一个约束,允许编译器确保该属性存在:

public interface Eliminatable
{
    bool Eliminated { get; set; }
}

public void Delete<T>(List<T> data) where T : Eliminatable
{      
    if (data != null)
    {
        data.ForEach(x => { x.Eliminated = true; });
    }           
}

或者(有些人可能会说这是一个黑客行为)你可以相信你的用户他们实际传递的东西T确认你的模式:

public void Delete<T>(List<T> data)
{      
    if (data != null)
    {
        data.ForEach(x => { dynamic d = x; d.Eliminated = true; });
    }           
}

如果属性不存在,现在这将失败。在运行时。不太好。但它“有效”。