将委托从模型映射到实体

Map Delegate from Model to Entity

假设我有以下模型:

class Foo
{
   public delegate void Bar();
   public Bar MyBar { get; set; }
}

我想将其映射到我的实体:

class FooEntity
{
   public delegate void Bar();
   public Bar MyBar { get; set; }
}

这是怎么做到的?我试过使用 Automapper:

void ConfigureMappings()
{
    // how else do I need to configure this?
    Mapper.CreateMap<Foo, FooEntity>();
    Mapper.CreateMap<Foo.Bar, FooEntity.Bar>(); // is this right?
}

让数据驱动这个委托对我来说很重要,因为根据 MyBar 的值,我需要能够在数百种不同的方法之间切换。有什么想法吗?

编辑:好的,因此在将委托移出每个 class:

的范围后从模型映射到实体时不再抛出异常
public delegate void Bar(object obj);

public class Foo
{
   public Bar MyBar { get; set; }
}

public class FooEntity
{
   public Bar MyBar { get; set; }
}

现在我收到此消息:错误 3004:从第 6:No 行开始映射片段时出现问题,映射是为 Set Foos 中的属性 FooEntity.MyBar 指定的。具有键 (PK) 的实体在以下情况下不会往返:实体的类型为 [Project.MyDbContext.FooEntity].

我的数据库上下文代码如下所示:

class MyDbContext : DbContext
{
    DbSet<FooEntity> Foos { get; set; }
}

然后我将其保存到数据库中:

public static class Test()
{
   var foo = new Foo { MyBar = MyFancyDelegate };
   using (var context = new MyDbContext())
   {
       context.Foos.Add(Mapper.Map<FooEntity>(foo));
       context.SaveChanges();
   }
}

public static void MyFancyDelegate(object obj)
{
   Console.Write("test");
}

我的问题是否出在我正在尝试做的事情上?是否无法将委托方法保存到 SQL table?

如评论中所述,无法按照我尝试的方式将委托存储在 SQL 中。

相反,有两种方法可以用来解决问题:

  • 序列化委托指针。然后可以将 byte[] 对象转换为字符串并存储。检索值时,可以将其转换回 byte[] 对象(使用 Convert.ToBase64StringConvert.FromBase64String 进行转换)。这种方法的优点是您不需要任何类型的即时编译代码;您只是找到指向您已经可以访问的代码的指针。缺点当然是如果您更改方法签名的任何内容,您的指针将会中断。

  • 将代码文本本身存储为字符串,然后使用 System.CodeDom 或其他一些编译库对其进行动态编译。这种方法的优点是所见即所得;您能够查看存储中的代码,并能够在应用程序上下文之外对其进行操作。缺点:你的代码不能在它自己的作用域之外引用对象,而且你知道代码实际上 运行 正确(因为它现在在你的源代码控制之外存储和访问),你失去了任何安全性。

您可以将委托替换为包含委托方法代码的字符串。 然后添加一个 "get only property" 或使用 Roslyn 将字符串 属性 转换为 c# 方法的方法。