Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将泛型类型强制转换为列表_C#_Generics - Fatal编程技术网

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。