小编Mat*_*eld的帖子

在编译时检测目标框架版本

我有一些使用扩展方法的代码,但是使用VS2008中的编译器在.NET 2.0下编译.为了促进这一点,我不得不声明ExtensionAttribute:

/// <summary>
/// ExtensionAttribute is required to define extension methods under .NET 2.0
/// </summary>
public sealed class ExtensionAttribute : Attribute
{
}
Run Code Online (Sandbox Code Playgroud)

但是,我现在想要包含该类的库也可以在.NET 3.0,3.5和4.0下编译 - 没有'ExtensionAttribute在多个地方定义'警告.

当目标框架版本是.NET 2时,是否有任何编译时指令可用于仅包含ExtensionAttribute?

.net c# msbuild extension-methods visual-studio

57
推荐指数
5
解决办法
3万
查看次数

用于字节数组的StringBuilder的等效项

这是一个简单的,我认为可以回答的问题.我确实试图在这里找到答案,但没有提出任何答案 - 如果有我错过的东西,请道歉.

无论如何,是否有相当于StringBuilder的字节数组?

我并不担心所有不同的重载Append()- 但我想看到Append(byte)Append(byte[]).

周围有什么东西或者是你自己的时间吗?

c# stringbuilder bytearray

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

有没有办法阻止在编译时调用方法?

我有一些类,有几种方法,我真的不想在那里,但只是因为XML Serializer需要它们.无论如何,如果从用户代码调用它们会产生编译时错误/警告吗?

我知道我可以实现IXmlSerializable,而且我也知道我可以将类分离成纯粹的数据存储类,但是,我不是在问我应该如何设计这样一个系统,我只是在问是否有是一种生成编译时错误/警告的方法,如果它们被任何非XML序列化程序调用...

c# xml-serialization

7
推荐指数
2
解决办法
190
查看次数

财产决定论

在C#中有什么方法可以将属性标记为确定性的吗?

我问的原因是我经常发现自己声明一个局部变量并将属性读入其中,而不是多次访问该属性.

有没有什么方法可以将属性装饰为确定性的,这样编译器就可以优化对该属性的多次访问?我猜测在这种情况下,类需要是不可变的,并且这样装饰.

这是甚至存在的东西还是我抓着稻草?

c# deterministic properties

7
推荐指数
2
解决办法
315
查看次数

使用带反射的XPath样式查询

我有一个类树,它包含层次结构中的多个对象.所以我可能有一个Container对象,它承载3个SubContainer对象,这些对象又承载任意数量的Item对象.

有没有什么方法可以在这个对象树上使用XPath样式的表达式,这意味着反射,这样我就可以使用XPath样式的表达式查询类的属性,这样代码看起来像:

object o = Container.Query("/Container/SubContainer[1]/Item[1]/@ItemProperty");
Run Code Online (Sandbox Code Playgroud)

显然这完全弥补了,并且可能不是有效的XPath语法,但它只是为了让您了解我正在寻找的内容.

编辑 - >我想以这种方式查询的原因是因为对象的路径不是固定的,因此需要由应用程序用户配置.

谢谢.

.net c# reflection xpath

5
推荐指数
1
解决办法
1189
查看次数

为什么采用IEnumerable <interface>的函数不接受IEnumerable <class>?

比方说,我有一个班级:

public class MyFoo : IMyBar
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后,我想使用以下代码:

List<MyFoo> classList = new List<MyFoo>();
classList.Add(new MyFoo(1));
classList.Add(new MyFoo(2));
classList.Add(new MyFoo(3));

List<IMyBar> interfaceList = new List<IMyBar>(classList);
Run Code Online (Sandbox Code Playgroud)

但这会产生错误:

`Argument '1': cannot convert from 'IEnumerable<MyFoo>' to 'IEnumerable<IMyBar>' 
Run Code Online (Sandbox Code Playgroud)

为什么是这样?由于MyFoo实现了IMyBar,人们可以预期IEnumerable的MyFoo可以被视为IMyBar的IEnumerable.一个平凡的现实世界的例子是生产汽车列表,然后被告知它不是车辆列表.

这只是一个小小的烦恼,但如果有人能够对此有所了解,我会非常感激.

generics ienumerable inheritance covariance c#-3.0

5
推荐指数
1
解决办法
573
查看次数

确定将lambda编译为实例方法的时间

前言:我试图在这里非常精确地描述这个场景.该TL;DR版本是"我怎么知道,如果一个lambda会被编译成一个实例方法或关闭" ...

我在我的WPF项目中使用MvvmLight,并且该库最近更改为使用WeakReference实例以保存传递给的动作RelayCommand.因此,有效的,我们有正拿着一个对象某处WeakReferenceAction<T>.

现在,自升级到最新版本以来,我们的一些命令停止了工作.我们有一些像这样的代码:

ctor(Guid token)
{
    Command = new RelayCommand(x => Messenger.Default.Send(x, token));
}
Run Code Online (Sandbox Code Playgroud)

这导致关闭(请纠正我,如果我没有使用正确的术语)类生成 - 像这样:

[CompilerGenerated]
private sealed class <>c__DisplayClass4
{
    public object token;

    public void <.ctor>b__0(ReportType x)
    {
        Messenger.Default.Send<ReportTypeSelected>(new ReportTypeSelected(X), this.token); 
    }
}
Run Code Online (Sandbox Code Playgroud)

之前工作正常,因为操作存储在RelayCommand实例中,并且无论是编译为实例方法还是闭包(即使用'<> DisplayClass'语法),它都保持活动状态.

但是,现在,因为它保存在a中WeakReference,所以只有将指定的lambda编译为实例方法时,代码才有效.这是因为闭包类被实例化,传递到RelayCommand并且几乎立即被垃圾收集,这意味着当命令被使用时,没有动作要执行.因此,必须修改上述代码.将其更改为以下原因,例如:

Guid _token;
ctor(Guid token)
{
    _token = token;
    Command = new RelayCommand(x => Messenger.Default.Send(x, _token));
}
Run Code Online (Sandbox Code Playgroud)

这会导致编译的代码导致成员 - 如下所示:

[CompilerGenerated]
private void <.ctor>b__0(ReportType …
Run Code Online (Sandbox Code Playgroud)

c# lambda closures mvvm-light

5
推荐指数
1
解决办法
172
查看次数

为什么在处理Action的方法中捕获会截断堆栈跟踪?

考虑这个小程序.忽略,如果你愿意,通用捕获,我保持简短的尝试并说明要点:

private static void Main(string[] args)
{
    Try(Fail);
}

private static void Fail()
{
    var x = ((string)null).Clone();
}

private static void Try(Action action)
{
    try
    {
        action();
    }
    catch (Exception exc)
    {
        Debug.WriteLine(exc.StackTrace);                
    }
}
Run Code Online (Sandbox Code Playgroud)

运行时,会生成以下内容(删除一些路径信息):

at Scratch.Program.Fail() in Program.cs:line 27
at Scratch.Program.Try(Action action) in Program.cs:line 34
Run Code Online (Sandbox Code Playgroud)

我的问题是 - 为什么异常的堆栈跟踪会停止在方法中展开方法链Try()?我希望它能够超越Main()方法.

我一直无法找到任何关于停止异常展开的文件Try()- 所以我想了解这一点.

.net c# exception stack-trace

5
推荐指数
1
解决办法
373
查看次数

使项目在多个.NET版本之间保持同步

我需要在我的应用程序中创建一些核心库,这些库将在.NET 3.5和.NET 4.0中都可用.我很高兴创建多个项目,创建所需的定义并使用#ifdef控制哪些代码使其成为哪个输出程序集.

但是,我想知道的是,是否有办法让这些项目保持同步?当我在XNA下开发时,我有一个Windows构建和一个Windows Phone构建 - 并且XNA将一个属性注入到名为的项目文件中XnaCrossPlatformGroupID.它的作用是使Visual Studio能够自动确保在将文件添加到项目时将其添加到相应的项目中.因此,例如,如果我添加一个调用Foo.cs我的项目的Windows副本的文件,那么该相同的文件将添加到项目的Windows Phone副本中.

有没有办法在Visual Studio中为一组正常的项目复制那种行为?我宁愿不使用构建配置,因为我希望能够在一个步骤中编译所有目标平台,而无需借助IDE之外的工具(例如TeamCity).或者是否有另一种方法允许针对多个目标构建项目,而无需使用20种不同的构建配置来解决问题?

c# build-process visual-studio-2010 visual-studio

4
推荐指数
1
解决办法
971
查看次数

VB.NET如何将其解析为对象属性?

好吧,所以我是一个C#编码器,我甚至无法阅读VB.NET,所以请原谅可能会变成一个令人难以置信的愚蠢问题.但我有一些看起来像这样的代码:

Function GetName(sourceObject as Object) as String
    return sourceObject.Name
End Function
Run Code Online (Sandbox Code Playgroud)

因此,忽略语法可能错误的事实 - VB.NET如何从sourceObject获取Name属性?在运行时检查它会发现sourceObject是一种支持带有getter的名为Name的属性的类型,但VB.NET在这种情况下做了什么?是否有一些额外的代码由编译器生成,以某种方式在运行时自动转换?

你可能会说,我有点困惑.提前致谢!

vb.net properties late-binding

2
推荐指数
1
解决办法
356
查看次数

Catch-all路由无法使用WebApi2 ApiController查找路由

我正在创建一个WebApi2服务,我想要实现的一个方法表示来自内部树结构中的对象的HTTP GET - 所以请求将是:

GET /values/path/path/to/object/in/tree
Run Code Online (Sandbox Code Playgroud)

所以我希望我的方法接收"path/to/object/in/tree".

但是,当我运行它时,我只得到404,而且有趣的是我得到的404与标准的IIS 404不同.它的标题是'/'应用程序中的'服务器错误',而完全无效的那个资源标题为'HTTP错误404.0 - 未找到'.

我正在玩默认模板试试看我是否可以使用它,因此相似性.

我有这个 RouteConfig

public static void RegisterRoutes(RouteCollection routes)
{
    var route = routes.MapRoute(
               name: "CatchAllRoute",
                url: "values/path/{*pathValue}",
                defaults: new { controller = "Values", action = "GetPath" });
}
Run Code Online (Sandbox Code Playgroud)

这是我的ValuesController:

[System.Web.Mvc.AuthorizeAttribute]
[RoutePrefix("values")]
public class ValuesController : ApiController
{
    [Route("test/{value}")]
    [HttpGet]
    public string Test(string value)
    {
        return value;
    }

    [HttpGet]
    public string GetPath(string pathValue)
    {
        return pathValue;
    }
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果我派生Controller而不是ApiController它工作正常,但那么正常的属性路由不起作用.

我尝试按照这篇文章(http://www.tugberkugurlu.com/archive/asp-net-web-api-catch-all-route-parameter-binding)中的方法进行操作,但我无法使用它.

我敢肯定我错过了一些愚蠢的事情,但是花了几个小时才开始,我觉得谨慎地问我做错了什么.

谢谢 …

c# asp.net attributerouting asp.net-web-api2

2
推荐指数
1
解决办法
2001
查看次数

T-SQL条件SUM操作

我正在寻找一种干净,简洁的方式来有条件地执行SUM操作.我知道这要相当直接,但我不确定如何继续.为了表明我的意思,看一看......

    DECLARE @Test TABLE
(
    LevelID int,
    DataFieldID INT,
    RangeID INT,
    Value FLOAT
)

INSERT INTO @Test VALUES (22, 6, 117, 100)
INSERT INTO @Test VALUES (22, 6, 122, 100)
INSERT INTO @Test VALUES (22, 6, 126, 100)

INSERT INTO @Test VALUES (22, 7, 117, 100)
INSERT INTO @Test VALUES (22, 7, 122, 100)
INSERT INTO @Test VALUES (22, 7, 126, 100)

INSERT INTO @Test VALUES (23, 6, 117, 100)
INSERT INTO @Test VALUES (23, 6, 122, 100)
INSERT INTO …
Run Code Online (Sandbox Code Playgroud)

sql sql-server

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