首先,他们原谅我的英语,因为它不是我的母语。
我有一个接收通用列表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 =>
{
...
});
}
}
提前致谢!
答案 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; });
}
}
如果属性不存在,现在这将失败。在运行时。不太好。但它“有效”。