小编Imp*_*rks的帖子

C#方法覆盖了解决方案的怪异

请考虑以下代码段:

using System;

class Base
{
    public virtual void Foo(int x)
    {
        Console.WriteLine("Base.Foo(int)");
    }
}

class Derived : Base
{
    public override void Foo(int x)
    {
        Console.WriteLine("Derived.Foo(int)");
    }

    public void Foo(object o)
    {
        Console.WriteLine("Derived.Foo(object)");
    }
}

public class Program
{
    public static void Main()
    {
        Derived d = new Derived();
        int i = 10;
        d.Foo(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

令人惊讶的输出是:

Derived.Foo(object)
Run Code Online (Sandbox Code Playgroud)

我希望它能够选择被覆盖的Foo(int x)方法,因为它更具体.但是,C#编译器会选择非继承Foo(object o)版本.这也导致拳击操作.

这种行为的原因是什么?

c# inheritance overriding

25
推荐指数
2
解决办法
1015
查看次数

从持有人令牌(Web API)获取自定义声明值

在我的ASP.NET Web API项目中,我使用了承载令牌授权,并且我添加了一些自定义声明,如下所示:

var authType = AuthConfig.OAuthOptions.AuthenticationType;
var identity = new ClaimsIdentity(authType);
identity.AddClaim(new Claim(ClaimTypes.Name, vm.Username));

// custom claim
identity.AddClaim(new Claim("CompanyID", profile.CompanyId.ToString()));
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以在控制器中访问这个额外的索赔值而无需额外访问数据库?

asp.net claims-based-identity asp.net-web-api bearer-token

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

反射生成和泛型类型

我还有另一个令人讨厌的时刻Reflection.Emit和类型管理.

比如,我有一个名为的类型MyType,它在动态生成的程序集中定义.调用MyType.GetMethods()结果NotSupportedException,这减少了我编写自己的包装器和查找表的集合.但是,当我在GetMethods()使用我自己的类型作为泛型参数的标准泛型类型上调用或任何其他内省方法时,也会发生同样的情况:

  • Tuple<int, string> =>工作正常
  • Tuple<int, MyType> =>例外

我可以从泛型类型定义中获取方法列表:

typeof(Tuple<int, MyType).GetGenericTypeDefinition().GetMethods()

但是,这些方法具有通用占位符而不是实际值(例如T1,TResult等等).我不想写另一个将通用参数追溯到其原始值的kludge.

代码示例:

var asmName = new AssemblyName("Test");
var access = AssemblyBuilderAccess.Run;
var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, access);
var module = asm.DefineDynamicModule("Test");

var aType = module.DefineType("A");
var tupleType = typeof(Tuple<,>);
var tuple = tupleType.MakeGenericType(new [] { typeof(int), aType });

tuple.GetProperty("Item1"); // <-- here's the error
Run Code Online (Sandbox Code Playgroud)

所以问题是:

  1. 如何检测类型是否可以安全调用GetMethods()以及类似的方法?
  2. 如果类型不安全,如何获取实际的方法列表及其通用参数值?

c# reflection.emit

14
推荐指数
1
解决办法
1162
查看次数

WPF:多列列表框/列表视图?

我想在WPF中创建一个列表,在多个列中显示数据,例如Explorer在"小图标"视图模式下显示文件列表:

多列列表框

每个项目必须用a表示,DataTemplate滚动应该是水平的.我如何制作这样的清单?

wpf listview list

12
推荐指数
3
解决办法
2万
查看次数

Promise.catch()在AngularJS单元测试中没有捕获异常

我正在为Typescript中的应用程序编写Jasmine单元测试并通过Resharper运行它们.如果处理程序抛出异常,它应该执行一个动作:

describe("Q Service Test", () => {
    var q: ng.IQService;
    var rootScope: ng.IRootScopeService;

    beforeEach(inject(($q, $rootScope) => {
        q = $q;
        rootScope = $rootScope;
    }));

    it("Caught exceptions are handled properly", () => {
        var state = 'ok';
        q.when(1)
            .then(() => {
                throw new Error("test exception");
            })
            .catch(() => {
                state = 'error';
            });

        rootScope.$digest();
        expect(state).toBe('error');
    });
});
Run Code Online (Sandbox Code Playgroud)

但是,测试失败了:

Resharper测试失败

这是我的测试环境/工具的一些奇怪的行为,还是我错误地使用了promise机制本身?

unit-testing jasmine angularjs typescript

11
推荐指数
1
解决办法
3988
查看次数

Roslyn 源生成器被“忽略”?

我正在创建一个简单的 Roslyn 源生成器。生成器在调试中似乎运行良好,可以正确生成所需的类。但是,当从解决方案中的另一个项目引用它时,它附近会显示一个红色图标,并带有“忽略”工具提示,并且不会生成任何输出:

被忽视了!

生成器代码非常简单:

namespace CompetencesSourceGenerator
{
    using Microsoft.CodeAnalysis;

    [Generator]
    public class CompetenceNamesGenerator: CompetenceGeneratorBase
    {
        public override void Execute(GeneratorExecutionContext context)
        {
            context.AddSource(
                "CompetenceNames.g.cs",
                @"namespace Foo { public class Bar { } }"
            );
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

我检查了以下内容:

  • Generator 项目面向 .NET Standard 2.0
  • 引用项目目标 .NET 6
  • Microsoft.CodeAnalysis.CSharp生成器项目中的和Microsoft.CodeAnalysis.Analyzers都是最新的
  • VS 已更新 (17.4.4)
  • .NET 编译器平台 SDK 已安装

为什么它不起作用?

c# roslyn roslyn-code-analysis sourcegenerators

11
推荐指数
1
解决办法
1667
查看次数

C# 中奇怪的枚举名称解析

考虑以下代码:

using System;

namespace Test
{
    enum Foo
    {
        A = 1,
        B = 1,
        C = 1
    }
    
    public static class Program
    {
        public static void Main()
        {
            Console.WriteLine("{0}, {1}, {2}", Foo.A, Foo.B, Foo.C);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

明知枚举是引擎盖下只是整数,我希望它是两种A, A, AC, C, C。但令人惊讶的是,它打印出来了B, B, B!这种行为在 .NET Framework、.NET Core 3.x 和 .NET 5 中似乎是一致的。

它为什么选择B

.net c# enums

10
推荐指数
1
解决办法
855
查看次数

TypeBuilder的Type.GetMethod替代方案

我正在使用.NET兼容的编译器Reflection.Emit.问题是,虽然TypeBuilder是派生自Type,但它不允许我使用Type提供的所有方便的方法.

我真正关心的问题是:

  1. 有没有办法获得a中定义的方法,字段,属性,构造函数等的列表TypeBuilder,或者我真的需要TypeBuilderWrapper自己跟踪所有这些实体?它必须将它们存储在内部,所以必须有一些方法来提取它们?

  2. GetMethod方法非常方便,因为它可以找到最佳拟合方法覆盖考虑继承和通用协方差.我真的必须自己重新实现TypeBuilderWrapper吗?

同样的问题也可能适用于MethodBuilder,FieldBuilder等它,我相信,没有实现的查找方法MethodInfo,并FieldInfo分别.

.net c# reflection.emit getmethod typebuilder

9
推荐指数
1
解决办法
1195
查看次数

在ASP.NET应用程序启动时显示存根页面

在ASP.NET应用程序仍处于初始化过程中时,是否可以显示特定页面?

我们有一个庞大的ASP.NET应用Application_Start()程序,每次重新部署或AppDomain重启后,需要大约30秒才能完成其处理程序.在此期间显示一个不错的自动重新加载"暂时不可用"页面将极大地改善第一用户的体验.

我试图提取初始化代码到一个不同的线程,但它有很大的依赖性:对HttpContext,Server和其他几类都源自线程不可用.代码变得干扰和不可理解,所以我正在寻找更好的解决方案.也许一些IIS配置或扩展?

c# asp.net iis asp.net-mvc

7
推荐指数
1
解决办法
2011
查看次数

在重定向上传递消息以在ASP.NET MVC中查看

我有一个ASP.NET MVC在线商店类应用程序,有两个视图:

  • 项目的页面(照片,描述等)
  • 用户可以留下评论的表单

用户成功提交表单后,应将其重定向回项目页面,并在顶部显示一次性消息:"您的评论已成功提交".

控制器代码(简化)如下所示:

[HttpGet]
public ActionResult ViewItem([Bind] long id)
{
    var item = _context.Items.First(x => x.Id == id);
    return View(item);
}

[HttpGet]
public ActionResult AddReview()
{
    return View();
}

[HttpPost]
public ActionResult AddReview([Bind] long id, [Bind] string text)
{
    _context.Reviews.Add(new Review { Id = id, Text = text });
    _context.SaveChanges();

    return RedirectToAction("ViewItem");
}
Run Code Online (Sandbox Code Playgroud)

有几个要求要满足:

  • 如果用户刷新项目页面,则不得再次显示该消息.
  • 该消息不得污染URL.
  • 控制器方法可能不会合并为一个.

我想将消息存储在用户会话中并在显示后将其丢弃,但是可能有更好的解决方案吗?

asp.net asp.net-mvc redirect

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