C# 简洁的工厂对象构造

C# 简洁的工厂对象构造,c#,generics,dapper,C#,Generics,Dapper,我有以下类似的查询 _connection.Query<SomeType>(SELECT Id, Type, Time FROM table) 现在我可以定义某种类型的SomeType或任何东西,为了使用正确的泛型SomeType,我需要重建对象 我想做的是有一条像这样的线,它能真正工作 var x = _connection.Query<SomeType<object>>("...") as SomeType<OtherType> var

我有以下类似的查询

_connection.Query<SomeType>(SELECT Id, Type, Time FROM table)
现在我可以定义某种类型的
SomeType
或任何东西,为了使用正确的泛型
SomeType
,我需要重建对象

我想做的是有一条像这样的线,它能真正工作

var x =  _connection.Query<SomeType<object>>("...") as SomeType<OtherType>
var x=\u connection.Query(“…”)作为SomeType
(显然,这不是一个好例子,但在我看来,这更有意义)

无论如何,这显然会返回null,而且不会真正起作用

我想也许可以通过定义其他的方式来构造类型,也许可以连接到dapper初始化类型的方式并定义工厂或其他什么


有什么建议可以帮助我做到这一点吗?

我不知道Dapper中使用的类型有任何可配置的工厂

我快速查看了github上的代码,没有发现任何明显的问题,但我没有进行彻底的搜索

有,但它们似乎更多地用于映射值类型、模型对象上的属性,而不是修改模型对象本身

因此,我认为您必须以更手动的方式处理此问题:

public class SomeType
{
    public int Id { get; set; }
    public SomeTypeType Type { get; set; }
    public DateTime Time { get; set; }
    public T Object { get; set; }
}

public class SomeType<T> : SomeType
{
    public T Object { get; set; }

    public SomeType() { }
    public SomeType(SomeType someType, T obj)
    {
        this.Id = someType.Id;
        ...
        this.Object = obj;
    }
}

var someType = _connection.Query<SomeType>("SELECT Id, Type, Time FROM table");
var obj = new Foo();
var specialisedSomeType = new SomeType<Foo>(someType, obj);
公共类SomeType
{
公共int Id{get;set;}
公共SomeTypeType{get;set;}
公共日期时间{get;set;}
公共T对象{get;set;}
}
公共类SomeType:SomeType
{
公共T对象{get;set;}
公共SomeType(){}
公共SomeType(SomeType SomeType,T obj)
{
this.Id=someType.Id;
...
this.Object=obj;
}
}
var someType=_connection.Query(“从表中选择Id、类型、时间”);
var obj=新的Foo();
var SpecializedSomeType=新的SomeType(SomeType,obj);

构造函数中从“SomeType”到“SomeType”的手动映射可能会变得单调乏味,因此您可以使用类似的方法来处理该位。

所以它是一种嵌套对象,您想通过查询填充它吗?
public class SomeType
{
    public int Id { get; set; }
    public SomeTypeType Type { get; set; }
    public DateTime Time { get; set; }
    public T Object { get; set; }
}

public class SomeType<T> : SomeType
{
    public T Object { get; set; }

    public SomeType() { }
    public SomeType(SomeType someType, T obj)
    {
        this.Id = someType.Id;
        ...
        this.Object = obj;
    }
}

var someType = _connection.Query<SomeType>("SELECT Id, Type, Time FROM table");
var obj = new Foo();
var specialisedSomeType = new SomeType<Foo>(someType, obj);