【问题标题】:C# Passing Type as a variable. How to accomplish?C# 将类型作为变量传递。如何实现?
【发布时间】:2019-10-03 21:46:06
【问题描述】:

我有一些我希望能够重用的代码。为此,我需要动态传递 DbSet 类型。我该如何让它发挥作用?

 public virtual DbSet<Runlist> Runlists { get; set; }
public void Method(Type myType)
{
    using (var ctx = new FpContext())
    {
        Type myVariableType = myType;
        var table = "myTable";

        var sql = ctx.Database
            .SqlQuery<myVariableType>("SELECT * FROM  @table WHERE (UserId = @userid)"
            , new SqlParameter("@userid", user.Id)
            , new SqlParameter("@table", table)).ToList();
    }

foreach (var r in sql)
{
    foreach (XElement e in xmlDoc.Descendants(ns + "RateRequest"))
    {
        var originCode = e.Element(ns + "RequestedShipment").Element(ns + "Shipper").Element(ns + "Address").Element(ns + "PostalCode");
        var postalCode = e.Element(ns + "RequestedShipment").Element(ns + "Recipient").Element(ns + "Address").Element(ns + "PostalCode");
        var shipTime = e.Element(ns + "RequestedShipment").Element(ns + "ShipTimestamp");
        var serviceType = e.Element(ns + "RequestedShipment").Element(ns + "ServiceType");
        var totalWeight = e.Element(ns + "RequestedShipment").Element(ns + "TotalWeight").Element(ns + "Value");
        var packageCount = e.Element(ns + "RequestedShipment").Element(ns + "PackageCount");
        var weight = e.Element(ns + "RequestedShipment").Element(ns + "RequestedPackageLineItems").Element(ns + "Weight").Element(ns + "Value");

        originCode.SetValue(origin);
        postalCode.SetValue(r.Zipcode);
        shipTime.SetValue(dt);
        serviceType.SetValue("FEDEX_GROUND");
        totalWeight.SetValue(r.TotalWeight);
        packageCount.SetValue(r.BoxCount);
        weight.SetValue(r.Weight);
    }

    xmlDoc.Save(HttpContext.Current.Server.MapPath("~/Requests/SoapRequest_v24.xml"));

}
}

我已经发布了额外的代码来尝试更多地解释我想要完成的事情。

【问题讨论】:

  • 你可以使用反射,但一般来说泛型不适用于运行时类型
  • 查看documentation of SqlQuery,使用适当的重载。
  • 在下面的 cmets 上,您说:“关于如何实现这一点并访问 Dbset 的列名有什么建议吗?”你想要一个通用的查询构建器,你可以在其中编写如下内容:RunList.Get(x =&gt; x.Name, x.Time, x.Location).ToList&lt;T2&gt;();

标签: c# sql-server ado.net


【解决方案1】:

如果您使用 EntityFramework 中的 SqlQuery 方法,则会有一个接收类型作为参数的重载,因此您的代码可能类似于:

public void Method(Type myType)
{
    using (var ctx = new FpContext())
    {
        Type myVariableType = myType;
        var table = "myTable";

        var sql = ctx.Database
            .SqlQuery(myVariableType, "SELECT * FROM  @table WHERE (UserId = @userid)"
            , new SqlParameter("@userid", user.Id)
            , new SqlParameter("@table", table)).ToList();
    }
}

你可以检查那个方法here

【讨论】:

  • 我尝试了这个建议,但我失去了 ToList 方法,无法再访问表列。
  • 你能分享一下你想用输出列表做什么的模式细节吗?
猜你喜欢
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 2014-04-03
  • 2022-01-15
  • 2021-08-15
  • 1970-01-01
相关资源
最近更新 更多