LinQ XML映射到泛型类型

时间:2009-08-24 23:28:55

标签: .net linq linq-to-sql

我正在尝试使用外部XML文件将存储过程的输出映射到类的实例中。问题是我的类是通用类型:

public class MyValue<T>
{
  public T Value
  {
    get;
    set;
  }
}

在很多博客中搜索我设法得到的文章:

<?xml version="1.0" encoding="utf-8" ?>
<Database Name="" xmlns="http://schemas.microsoft.com/linqtosql/mapping/2007">
    <Table Name="MyValue" Member="MyNamespace.MyValue`1" >
        <Type Name="MyNamespace.MyValue`1">
            <Column Name="Category" Member="Value" DbType="VarChar(100)" />
        </Type>
    </Table>
    <Function Method="GetResourceCategories" Name="myprefix_GetResourceCategories" >
        <ElementType Name="MyNamespace.MyValue`1"/>
    </Function>
</Database>

MyNamespace.MyValue`1 技巧可以正常工作,并且可以识别该类。我希望存储过程有四行,我得到四个MyValue&lt; string&gt;实例,但最大的问题是所有四个实例的属性值为null。该属性未被映射,我真的不明白为什么。也许值得注意的是,属性Value是通用的,并且当使用属性完成映射时,它工作得很完美。

任何人都有线索?

BTW方法GetResourceCategories:

public ISingleResult<MyValue<string>> GetResourceCategories()
{
  IExecuteResult result = this.ExecuteMethodCall(
    this,
    (MethodInfo)MethodInfo.GetCurrentMethod());

  return (ISingleResult<MyValue<string>>)result.ReturnValue;
}

2 个答案:

答案 0 :(得分:0)

我很好奇你决定使用这种映射方法的原因。在我使用Linq2SQL并使用存储库类型模式的大多数场景中,您将返回一个通用类型的Entity,并且您将使用部分类来扩展Linq2Sql类的行为。

为了使这项工作有效,你可以使用Damien Guard创建的{4}的T4 Linq2Sql模板强制在Linq2Sql类上实现接口。

如果您被迫采用这种实现方法,那么我们需要查看执行映射的代码。

答案 1 :(得分:0)

当我为同一个问题做研究时,我遇到过这篇文章。就像在这里关闭循环的注释一样,我发现您可以在映射XML源文件中引用泛型类型。在上面的示例中,您缺少的一件是指定单一类型参数的类型。

你可以说:

<Type Name="MyNamespace.MyValue`1">

你必须说:

<Type Name="MyNamespace.MyValue`1[[System.String, mscorlib]]">

在我的场景中,我想要一个Guid值列表。因此,我创建了一个类SingleValue<T>,而不是创建一个专门绑定到Guid值列表的结果实体。这样,任何时候我需要获得单个值类型的列表,我可以。我只是在我的xml映射中指定类型。