可能重复:
通用约束,其中T:struct和T:class
是否有一个特殊的原因是您不能在C#中使用互斥的类型约束来重载泛型方法?例如,采取以下方法:
T DoSomething<T>(T arg) where T : class
{ /* Do something */ }
T DoSomething<T>(T arg) where T : struct
{ /* Do something */ }
Run Code Online (Sandbox Code Playgroud)
并试着用它们来调用它们
DoSomething("1");
DoSomething(1);
Run Code Online (Sandbox Code Playgroud)
我看到它的方式,DoSomething()方法就它们将采用的参数是互斥的 - 第一个采用引用类型,第二个采用值类型.编译器应该能够告诉使用字符串参数的DoSomething调用转到第一个方法,并且使用int参数的DoSomething调用转到第二个方法.
我在遗传学上遗漏了一些概念吗?或者这只是一个未在C#中实现的功能?
我想在C#中调用第三方代码时拦截并注入自定义代码.我正在使用外部库(AutoIt)进行GUI自动化.AutoIt dll没有源代码.
使用此框架完成的所有操作都是从AutoItClass
提供对所有方法的访问权的单个类()执行的.我希望能够在调用此类的方法时注入自定义代码,这可能吗?例如:
通过继承此类并重写其所有方法(这是必须的,因为这是一个COM对象),这可能非常简单,但这不是首选方法.任何评论都会有所帮助!
在针对特定网站的一些管理功能中,我正在做一个特别可怕的帖子,需要发布大量数据.为了实现这一点,我不得不添加Web.config appSetting:
<add key="aspnet:MaxHttpCollectionKeys" value="2000" />
Run Code Online (Sandbox Code Playgroud)
但是,我只希望在特定情况下可以使用这个大帖子.有没有办法以编程方式设置此值?
我正在为braindead企业XML API编写一个包装器.我有一个XDocument,我需要变成一个字符串.由于它们的XML解析器非常挑剔,甚至无法处理XML节点之间的空白,因此文档声明必须完全正确:
<?xml version="1.0"?>
Run Code Online (Sandbox Code Playgroud)
但是,XDocument.Save()方法始终在该声明中添加一个encoding属性:
<?xml version="1.0" encoding="utf-16"?>
Run Code Online (Sandbox Code Playgroud)
随着过去一小时花在Google和Stack上寻找生成XML字符串的最佳方式,我能做的最好的事情是:
string result = xmlStringBuilder.ToString().Replace(@"encoding=""utf-16"", string.Empty));
Run Code Online (Sandbox Code Playgroud)
我试过了
xdoc.Declaration = new XDeclaration("1.0", null, null);
Run Code Online (Sandbox Code Playgroud)
这确实成功地按照我想要的方式在XDocument中设置声明; 但是,当我调用Save()方法时,无论我走哪条路线(使用TextWriter,添加XmlWriterSettings等),编码属性都会被神奇地抛回其中.
有没有人有更好的方法来做到这一点,或者我的代码永远注定在一个可怕的字符串替换上面的注释中有一段咆哮?
我正在使用Braintree API for .NET来处理付款.他们的业务处理付款很好,API包装器可以直接使用.但是,经过仔细调查或更加剧烈的使用,提供的API包装器会很快失败; 例如,它包含手卷enum
.我的问题来自单元测试使用此包装器的代码.
为了做到这一点,我基本上需要模拟我自己的'假'Braintree网关,其中会有一些已知值,在请求时产生错误等.我的攻击计划是覆盖Braintree API包装器的功能和将请求重新路由到本地内存中端点.然后我可以使用依赖注入在运行时链接正确的网关/包装器.
最初,它似乎在游泳:尽管在API包装器中已经犯了软件工程的罪,但我需要覆盖的每一种方法都奇迹般地被标记出来virtual
.但是,这种情况突然停止了:API包装器中的几乎构造函数都被标记了internal
.因此,我既不能继承这些类,也不能随意创建它们以进行测试.
旁白:我理解internal
构造函数,以及合理地想要使用它们的原因.但是,我已经查看了这个的源代码,并且每个internal
构造函数只执行简单的属性赋值.因此,我很自然地声称应该遵循不同的编码习惯.
所以,我基本上有三个选择:
从头开始编写我自己的API包装器.这显然是可行的,并且具有可以产生精心设计的基础设施的优势.然而,缺点太多,无法简要列出.
从API中提取源代码并将其包含在我的解决方案中.我可以将所有internal
构造函数更改为我需要使它们工作的任何内容.缺点是我必须在每个后续的API包装器发布时重新更新所有这些更改.
为我需要在整个API包装器中使用的每个对象编写包装类.这具有不改变提供的源代码的优点; 但缺点很大:基本上重写包装器中的每个类三次(接口,Braintree API包装适配器和可测试版本).
不幸的是,所有这些都很糟糕.我觉得选项2可能是选项中最不好的选择,但它让我觉得很脏.有没有人已经解决了这个问题/编写了一个更好,更可测试的包装器?如果没有,我是否错过了可能的行动方案?如果没有,这三个选项中的哪一个似乎最不令人反感?
我需要一个.NET的PGP服务,它将提供以下内容:
作为字节数组和/或流提供的文件的加密/解密(例如写入硬盘驱动器并让服务读取它是不可接受的)
使用以字节数组和/或流传入的任意键
需要为没有人看的服务器上运行的无头服务工作(不需要模态弹出窗口或用户输入)
我们已经感受到了几种产品,但对它们的工作原理并不完全满意.有什么建议吗?谢谢!
我正在运行一个WCF应用程序,CoreApplication
其VS项目有一个引用AncillaryProject
.CoreApplication
使用Provider
来自的类AncillaryProject
; 但是,它永远不会被明确引用 - 它是通过Reflection调用的.
我的问题是有时候 CoreApplication
找不到Provider
因为AncillaryProject
没有在调用中出现GetAssemblies()
.有时它工作正常,但有时(我猜它可能是在JIT之后)它失败了.
这是我的原始代码:
var providers = from d in AppDomain.CurrentDomain.GetAssemblies()
from c in d.GetTypes()
where typeof(BaseProvider).IsAssignableFrom(c)
select c;
Run Code Online (Sandbox Code Playgroud)
看完这个问题后,我尝试使用GetReferencedAssemblies()
:
var allAssemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
{
allAssemblies = allAssemblies.Union(
a.GetReferencedAssemblies()
.Select(b => System.Reflection.Assembly.Load(b)));
}
var providers = from d in allAssemblies
from c in d.GetTypes()
where typeof(BaseProvider).IsAssignableFrom(c)
select c;
Run Code Online (Sandbox Code Playgroud)
我意识到我引用的问题通过动态加载bin目录中的所有dll文件来解决问题,但这对我来说听起来不是特别好.有没有更好的方法来做到这一点 …
最近更新 VS Code 后,由于长时间运行的保存参与者,我的解决方案中的 C# 文件开始偶尔需要几秒钟的时间才能保存。我想查看哪些保存参与者在保存时处理文件的日志,并查看是否有任何内容与设置相冲突files.participants.timeout
。
如何查看参与文件保存管道的扩展/功能的列表,以便我可以找出哪个扩展/功能行为不当?
在一种称为scala(2.11)宏的方法中,是否有一种方法可以以编程方式确定a是否Type
为a case class
?
我正在研究的方法的API可以归结为:
def typeIsCaseClass(c: Context)(targetType: c.universe.Type): Boolean = {
// targetType "is case class?"
}
Run Code Online (Sandbox Code Playgroud)
如果需要,我愿意更改API。
根据文档enum
,我添加了一个实体框架并将其注册到 NPGSQL 中:
static DataContext()
{
NpgsqlConnection.GlobalTypeMapper.MapEnum<MyEnum>();
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ForNpgsqlHasEnum<MyEnum>();
...
}
Run Code Online (Sandbox Code Playgroud)
运行迁移并启动 Web 应用程序后,抛出以下异常:
CLR 枚举类型 MyEnum 必须在使用前向 Npgsql 注册,请参考文档
如果我再次重新启动应用程序,它工作得很好 - 这只会在MyEnum
应用了添加的迁移后立即发生。
我的代码:
public class Employee
{
public int EmployeeId { get; set; }
public string FullName { get; set; }
public byte[] AvatarImage { get; set; }
}
public class EmployeeVm
{
public int EmployeeId { get; set; }
public string FullName { get; set; }
public IFormFile AvatarImage { get; set; }
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(EmployeeVm model)
{
if (ModelState.IsValid)
{
var employees = new Employee
{
FullName = model.FullName
};
using (var memoryStream = new MemoryStream()) …
Run Code Online (Sandbox Code Playgroud) c# ×9
.net ×4
asp.net ×2
reflection ×2
api ×1
asp.net-core ×1
asp.net-mvc ×1
assemblies ×1
autoit ×1
braintree ×1
c#-4.0 ×1
case-class ×1
cryptography ×1
generics ×1
gnupg ×1
linq-to-xml ×1
npgsql ×1
overloading ×1
pgp ×1
scala ×1
scala-2.11 ×1
scala-macros ×1
testing ×1
unit-testing ×1