将Linq查询结果转换为接口

Ran*_*der 4 c# linq interface

我正在尝试编写一个Linq(到对象)查询,该查询将结果转换为接口,如下所示:

    var data = (from row in CicApplication.Vaporizer473Cache
                where row.Coater == coater
                select row).Cast<IVaporizerData>();
Run Code Online (Sandbox Code Playgroud)

这似乎是执行此操作的唯一方法,因为我无法在select中创建接口的实例。我有两个问题:

  1. 演员表实际如何完成?它将在源中找到每个属性并将其值复制到具有相同名称的interface属性吗?

  2. 我的界面中有一个属性,该属性未包含在源代码中,但是我想以某种方式在此操作期间设置其值。这可能吗?还是我需要在查询后在每个语句的a中执行此操作?

如果有帮助,则数据源(Vaporizer473Cache)的类定义如下所示。界面非常相似。

internal class Vaporizer473
{
    /// <summary>
    /// Gets or sets the Coater property
    /// </summary>
    public string Coater { get; set; }

    /// <summary>
    /// Gets or sets the CoaterTime property
    /// </summary>
    public DateTime? CoaterTime { get; set; }

    /// <summary>
    /// Gets or sets the TemperatureLeftTubeA property
    /// </summary>
    public double? TemperatureLeftTubeA { get; set; }

    /// <summary>
    /// Gets or sets the TemperatureLeftTubeB property
    /// </summary>
    public double? TemperatureLeftTubeB { get; set; }

    /// <summary>
    /// Gets or sets the TemperatureRightTubeA property
    /// </summary>
    public double? TemperatureRightTubeA { get; set; }

    /// <summary>
    /// Gets or sets the TemperatureRightTubeB property
    /// </summary>
    public double? TemperatureRightTubeB { get; set; }
Run Code Online (Sandbox Code Playgroud)

}

Str*_*ior 5

即使编译器不会抱怨您提供的语法,也不会运行。您不能将对象强制转换为未实现的接口。

Cast方法只是一种方便的方法,它尝试将给定对象中的每个对象都IEnumerable转换为您提供的通用类型。如果Vaporizer473 确实实现了IVaporizerData,那么您可以很容易地说:

var data = from row in CicApplication.Vaporizer473Cache
           where row.Coater == coater
           select (IVaporizerData)row;
Run Code Online (Sandbox Code Playgroud)

其次:

我的界面中有一个属性,该属性未包含在源代码中,但是我想以某种方式在此操作期间设置其值。这可能吗?还是我需要在查询后在每个语句的a中执行此操作?

如您现在所知,您的类将必须在接口中实现该属性。(您可以显式地执行此操作,这样就不会在实际的类实现上拥挤智能感知。)可以使用复杂的Select委托随时设置值,但这不是LINQ的目的,我会高度重视阻止它。在这种情况下,for循环是适当的事情。

请记住,如果您修改来自缓存的项目,则将修改原始对象,而不是它们的克隆。这可能会产生深远的影响。您可能想创建新的对象来表示您要查找的数据。