小编Fiz*_*zzy的帖子

如何以编程方式在C#中执行方法重载解析?

当C#编译器解释方法调用时,它必须使用(静态)参数类型来确定实际调用哪个重载.我希望能够以编程方式执行此操作.

如果我有一个方法(a string)的名称,声明它的类型(一个实例System.Type),以及一个参数类型列表,我希望能够调用标准库函数并获取一个MethodInfo表示C#方法的对象编译器会选择调用.

例如,如果我有

class MyClass {
  public void myFunc(BaseClass bc) {};
  public void myFunc(DerivedClass dc) {};
}
Run Code Online (Sandbox Code Playgroud)

然后,我想是这样的虚构功能GetOverloadedMethodSystem.Type

MethodInfo methodToInvoke
  = typeof(MyClass).GetOverloadedMethod("myFunc", new System.Type[] {typeof(BaseClass)});
Run Code Online (Sandbox Code Playgroud)

在这种情况下methodToInvoke应该是public void myFunc(BaseClass bc).

:既不方法GetMethodGetMethods将成为我的目的.他们都没有做任何重载决议.在GetMethod它的情况下它只返回完全匹配.如果你给它更多的派生参数,它将只返回任何东西.或者你可能有幸得到一个模糊性异常,它没有提供有用的信息.

c# reflection system.reflection overload-resolution system-codedom-compiler

21
推荐指数
1
解决办法
579
查看次数

Entity Framework Core 不尊重 Identity 列

实体框架不尊重我的Identity专栏。它坚持尝试将一个值插入到Identity我的 MS SQL DB 中的(自动增量)列中,这显然是一个错误,因为数据库应该提供该值。

System.Data.SqlClient.SqlException: 'Cannot insert explicit value for identity column in table 'Assignee' when IDENTITY_INSERT is set to OFF.'
Run Code Online (Sandbox Code Playgroud)

它为什么要这么做?我将其与涉及一个表和一列的模式配对:

CREATE TABLE [dbo].[Assignee](
  [AssigneeID] INT IDENTITY(-1, 1) NOT NULL
CONSTRAINT [Assignee$PrimaryKey] PRIMARY KEY CLUSTERED 
( [AssigneeID] ASC ))
Run Code Online (Sandbox Code Playgroud)

将此模式发布到本地数据库后,我用它Scaffold-DbContext来生成实体和上下文类。生成的Assignee类仅包含此公共属性。

public int AssigneeId { get; set; }
Run Code Online (Sandbox Code Playgroud)

上下文仅指Assignee此处:

modelBuilder.Entity<Assignee>(entity =>
{
  entity.Property(e => e.AssigneeId).HasColumnName("AssigneeID");
});
Run Code Online (Sandbox Code Playgroud)

四处搜索,我看到人们声称要让 EF 尊重 Identity 列,上下文应该使用ValueGeneratedOnAdd(). 换句话说,上下文类中的行应为:

entity.Property(e => e.AssigneeId).HasColumnName("AssigneeID")
  .ValueGeneratedOnAdd();
Run Code Online (Sandbox Code Playgroud)

我对此有两个问题: …

c# t-sql entity-framework auto-increment entity-framework-core

6
推荐指数
1
解决办法
1万
查看次数