请考虑以下代码段:
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)版本.这也导致拳击操作.
这种行为的原因是什么?
在我的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)
有没有什么方法可以在控制器中访问这个额外的索赔值而无需额外访问数据库?
我还有另一个令人讨厌的时刻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)
所以问题是:
GetMethods()以及类似的方法?我想在WPF中创建一个列表,在多个列中显示数据,例如Explorer在"小图标"视图模式下显示文件列表:

每个项目必须用a表示,DataTemplate滚动应该是水平的.我如何制作这样的清单?
我正在为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)
但是,测试失败了:

这是我的测试环境/工具的一些奇怪的行为,还是我错误地使用了promise机制本身?
我正在创建一个简单的 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)
我检查了以下内容:
Microsoft.CodeAnalysis.CSharp生成器项目中的和Microsoft.CodeAnalysis.Analyzers都是最新的为什么它不起作用?
考虑以下代码:
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, A或C, C, C。但令人惊讶的是,它打印出来了B, B, B!这种行为在 .NET Framework、.NET Core 3.x 和 .NET 5 中似乎是一致的。
它为什么选择B?
我正在使用.NET兼容的编译器Reflection.Emit.问题是,虽然TypeBuilder是派生自Type,但它不允许我使用Type提供的所有方便的方法.
我真正关心的问题是:
有没有办法获得a中定义的方法,字段,属性,构造函数等的列表TypeBuilder,或者我真的需要TypeBuilderWrapper自己跟踪所有这些实体?它必须将它们存储在内部,所以必须有一些方法来提取它们?
该GetMethod方法非常方便,因为它可以找到最佳拟合方法覆盖考虑继承和通用协方差.我真的必须自己重新实现TypeBuilderWrapper吗?
同样的问题也可能适用于MethodBuilder,FieldBuilder等它,我相信,没有实现的查找方法MethodInfo,并FieldInfo分别.
在ASP.NET应用程序仍处于初始化过程中时,是否可以显示特定页面?
我们有一个庞大的ASP.NET应用Application_Start()程序,每次重新部署或AppDomain重启后,需要大约30秒才能完成其处理程序.在此期间显示一个不错的自动重新加载"暂时不可用"页面将极大地改善第一用户的体验.
我试图提取初始化代码到一个不同的线程,但它有很大的依赖性:对HttpContext,Server和其他几类都源自线程不可用.代码变得干扰和不可理解,所以我正在寻找更好的解决方案.也许一些IIS配置或扩展?
我有一个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)
有几个要求要满足:
我想将消息存储在用户会话中并在显示后将其丢弃,但是可能有更好的解决方案吗?
c# ×6
asp.net ×3
.net ×2
asp.net-mvc ×2
angularjs ×1
bearer-token ×1
enums ×1
getmethod ×1
iis ×1
inheritance ×1
jasmine ×1
list ×1
listview ×1
overriding ×1
redirect ×1
roslyn ×1
typebuilder ×1
typescript ×1
unit-testing ×1
wpf ×1