C# 如何将泛型类型强制转换为列表
我已经在基类中定义了一个抽象方法来接受泛型类型。我希望能够做的是将我的一个子类的列表传递给这个抽象方法。我只是不知道如何在子类中正确处理这个问题 基类抽象方法:C# 如何将泛型类型强制转换为列表,c#,generics,C#,Generics,我已经在基类中定义了一个抽象方法来接受泛型类型。我希望能够做的是将我的一个子类的列表传递给这个抽象方法。我只是不知道如何在子类中正确处理这个问题 基类抽象方法: protected abstract void Validate<T>(T records); 受保护的摘要无效验证(T记录); 子类实现(我遇到问题的地方): protected abstract void Validate<T>(T records); 调用方法(传入LogEventRecord列表):
protected abstract void Validate<T>(T records);
受保护的摘要无效验证(T记录);
子类实现(我遇到问题的地方):
protected abstract void Validate<T>(T records);
调用方法(传入LogEventRecord列表):
验证(记录);
方法(要处理LogEventRecord的列表):
受保护覆盖无效验证(T记录)
{
//在这里如何处理记录?我希望在调试时将它们列在列表中
//它们似乎是以这种方式出现的,但我无法在方法中使用它们
//我该如何将这些记录列入名单?我就是这么做的吗?
}
如果您有任何建议,我们将不胜感激。听起来您的方法确实有错误的签名。参数名是复数,但它只接受一个
T
,这意味着。我想应该是:
protected abstract void Validate<T>(IEnumerable<T> records);
那么您的子类将是:
public class Bar : Foo<LogRecord>
{
protected override void Validate(IEnumerable<LogRecord> records)
{
foreach (LogRecord record in records)
{
...
}
}
}
公共类栏:Foo
{
受保护的覆盖无效验证(IEnumerable记录)
{
foreach(记录中的日志记录)
{
...
}
}
}
但是,如果没有更多的上下文,很难知道这是否合适。如果不能立即使用,则可能需要进一步细分类。如下声明方法:
protected abstract void Validate<T>(IEnumerable<T> records)
Validate(records);
protected override void Validate<T>(IEnumerable<T> records)
{
//you can use a foreach loop
foreach (T record in records)
{
}
//Or "linq" operators:
bool isValid = records.Any(r => r.IsNotValid);
//Or linq query comprehension syntax:
bool isValid2 = (from r in records
where r.IsNotValid
select r).Any();
}
protected abstract void Validate<T>(IEnumerable<T> records) where T : MyRecordInterface
protected abstract void Validate(IEnumerable<MyRecordInterface> records)
编译器应该能够推断泛型方法的类型,而不需要显式地包含它。如果您确实希望包含类型,或者如果类型推断由于某种原因失败(您会知道这一点,因为编译器会向您投诉),您可以执行以下操作:
Validate<LogEventRecord>(records);
另一个选项是,在C#4中,对接口差异(包括IEnumerabe)有了新的支持,这将允许您完全避免在此处使用泛型方法。要利用这一点,只需确保您在Visual Studio 2010或更高版本中使用.Net 4,并声明如下方法:
protected abstract void Validate<T>(IEnumerable<T> records)
Validate(records);
protected override void Validate<T>(IEnumerable<T> records)
{
//you can use a foreach loop
foreach (T record in records)
{
}
//Or "linq" operators:
bool isValid = records.Any(r => r.IsNotValid);
//Or linq query comprehension syntax:
bool isValid2 = (from r in records
where r.IsNotValid
select r).Any();
}
protected abstract void Validate<T>(IEnumerable<T> records) where T : MyRecordInterface
protected abstract void Validate(IEnumerable<MyRecordInterface> records)
明确使用列表通常对我更有效
protected override void Validate<T>(List<T> records)
受保护覆盖无效验证(列出记录)
在没有类型参数的情况下调用它,编译器会计算出:Validate(records)
IList几乎总是优先于List,而IEnumerable几乎总是优先于IList。