我正在尝试使用外部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;
}
答案 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映射中指定类型。