我们说我有以下型号:
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
的值切换数百种不同的方法。有什么想法吗?
编辑:好的,所以在将委托移出每个类的范围之后,当从模型映射到实体时,不再抛出异常:
public delegate void Bar(object obj);
public class Foo
{
public Bar MyBar { get; set; }
}
public class FooEntity
{
public Bar MyBar { get; set; }
}
现在我收到了这个:错误3004:从第6行开始映射片段时出现问题:没有为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表中?
答案 0 :(得分:1)
正如评论中所提到的,我无法以我正在尝试的方式在SQL中存储委托。
相反,有两种方法可用于解决问题:
序列化委托指针。然后可以将byte[]
对象转换为字符串并存储。检索该值后,可以将其转换回byte[]
对象(使用Convert.ToBase64String
和Convert.FromBase64String
进行转换)。这种方法的优点是您不需要任何类型的动态编译代码;您只是找到指向您已有权访问的代码的指针。当然,缺点是如果您更改了方法签名的任何内容,指针就会中断。
将代码文本本身存储为字符串,然后使用System.CodeDom或其他一些编译库即时编译。这种方法的优点是你所看到的就是你得到的东西;您可以查看存储中的代码,并能够在应用程序的上下文之外对其进行操作。缺点:如果代码有自己的范围,您的代码就无法引用外部对象,并且在知道代码实际正常运行时会失去任何安全性(因为它现在存储并在源代码控制之外访问)。
答案 1 :(得分:1)
您可以使用包含委托方法代码的字符串替换您的委托。 然后添加一个&#34; get only property&#34;或者使用Roslyn将字符串属性转换为c#方法的方法。