0

我收到此错误:

“无法将‘System.Windows.Forms.DataGridViewRow’类型的对象转换为‘Win.Models.ResourceModel’类型。”

执行此代码时:

var qResources = this.dataGridViewResources.Rows
    .Cast<ResourceModel>()
    .AsQueryable();

即使我已经在ResourceModel:

public static implicit operator ResourceModel(DataGridViewRow row)
{
    List<string> columns = new List<string> { "ResourceName", "Path" };

    List<string> rColumns = new List<string>();
    foreach (DataGridViewColumn c in row.DataGridView.Columns)
    {
        rColumns.Add(c.Name);
    }

    if (!columns.All(c => rColumns.Contains(c))) { return null; }

    return new ResourceModel
    {
        name = row.Cells["ResourceName"].Value.AsString(),
        path = row.Cells["Path"].Value.AsString()
    };
}

现在,我已经用explicit AND implicit尝试过了。两者都因相同的错误而失败。有没有办法让Cast<ResourceModel>()工作?

注意:在强制转换运算符中放置断点时,它永远不会到达那里,所以我可能误解了该Cast<>方法。

4

3 回答 3

3

您的问题的答案可以在这里找到。

为了解决您的问题,这对我来说似乎不是一个好的“演员”,而更像是一种转换

我会将您的方法更改为静态ToResourceModel扩展:

public static ResourceModel ToResourceModel(this DataGridViewRow row)
{

并将您的查询更改为:

var qResources = this.dataGridViewResources.Rows
    .OfType<DataGridViewRow>() 
    .Select(r => r.ToResourceModel())
    .AsQueryable();

如果您的演员表运算符在其他地方使用,或者您出于某种原因不想更改它,您可以使用ConvertAll

var qResources = this.dataGridViewResources
                     .Rows
                     .OfType<DataGridViewRow>() 
                     .ConvertAll<ResourceModel>(row => (ResourceModel)row)
                     .AsQueryable()
于 2013-10-18T13:15:29.193 回答
1

用户定义的隐式/显式转换运算符完全是编译时构造。运行时根本不知道这些转换。因此,LinqCast方法将永远无法使用这些用户定义的转换。

发生的事情是编译器会注意到您正在尝试在预期使用 a 类型的DataGridViewRow变量ResourceModel。它不仅不编译,还会搜索任何用户定义的转换以使其工作。如果它找到一个,它会在类型周围插入对该静态方法的调用,以根据需要进行转换。

所以我们需要做的是确保我们在DataGridViewRow需要 a 时以编译器可以看到ResourceModel的方式使用 a。我们可以使用:Select

var qResources = this.dataGridViewResources.Rows
    .Cast<DataGridViewRow>() 
    .Select(row => (ResourceModel)row)
    .AsQueryable();

现在编译器可以添加对隐式转换的调用,一切都很好。

于 2013-10-18T14:39:46.000 回答
0

也许您可以尝试先选择绑定项目:

var qResources = this.dataGridViewResources.Rows
    .Select(r=>r.DataBoundItem)
    .Cast<ResourceModel>()
    .AsQueryable();
于 2013-10-18T14:34:52.003 回答