从遗留系统迁移到 ValueInjecter

发布于 2024-12-13 03:02:17 字数 1234 浏览 3 评论 0原文

我们有一个自定义对象扩展方法来处理以下内容。

  • 源是DataRow 目标是class
  • 源是 DataTable 目标是 List
  • 源是 class 目标是 class
  • 源是 List< ;class> 目标是 List

我发现 ValueInjecter 和DataTable 这样我就可以处理 DataRow 和 DataTable。
现在我已经到了将它们粘合在一起的阶段了。

这是我尝试过的。

public static class ObjectExtensions
{
    public static void OldFill(this object fillMe, object sourceObject)
    {
        Type sourceType = sourceObject.GetType();
        Type fillType = fillMe.GetType();

        switch (sourceType.Name)
        {
            case "DataRow":
                fillMe.InjectFrom<DataRowInjection>(sourceObject);
                break;

            case "DataTable":
                fillMe.InjectFrom<DataTableInjection<fillType>>(sourceObject);
                break;

            default:
                fillMe.InjectFrom(sourceObject);
                break;
        }
    }
}

不确定如何获得正确的 fillType 以使代码正常工作。
因为这是遗留代码,我不想更改扩展签名。

We had a custom object extension method that would handle the following.

  • Source is DataRow target is class.
  • Source is DataTable target is a List<class>
  • Source is class target is class
  • Source is List<class> target is List<class>

I found ValueInjecter and DataTable so I can handle a DataRow and DataTable.
So I am to the step where I am gluing it all together.

Here is what I tried.

public static class ObjectExtensions
{
    public static void OldFill(this object fillMe, object sourceObject)
    {
        Type sourceType = sourceObject.GetType();
        Type fillType = fillMe.GetType();

        switch (sourceType.Name)
        {
            case "DataRow":
                fillMe.InjectFrom<DataRowInjection>(sourceObject);
                break;

            case "DataTable":
                fillMe.InjectFrom<DataTableInjection<fillType>>(sourceObject);
                break;

            default:
                fillMe.InjectFrom(sourceObject);
                break;
        }
    }
}

Not sure how to get the right fillType to make the code work right.
Because this is legacy code I do not want to change the extension signature.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

流云如水 2024-12-20 03:02:17

我不知道答案,但我可以说 DataTableInjection 无法编译。您需要使用反射来进行绑定,如下所示:

case "DataTable":
  var tableInjector = typeof (DataTableInjection<>).MakeGenericType(fillType);
  tableInjector.GetMethod("InjectFrom").MakeGenericMethod(tableInjector)
    .Invoke(fillMe, new[] { sourceObject });
  break;

I don't know the answer, but I can say DataTableInjection<fillType> won't compile. You'd need to use Reflection to do the binding, something like this:

case "DataTable":
  var tableInjector = typeof (DataTableInjection<>).MakeGenericType(fillType);
  tableInjector.GetMethod("InjectFrom").MakeGenericMethod(tableInjector)
    .Invoke(fillMe, new[] { sourceObject });
  break;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文