小编Max*_*Max的帖子

为什么不能识别"异步无效"单元测试?

async void 单元测试无法在Visual Studio 2012中运行:

[TestClass]
public class MyTestClass
{
    [TestMethod]
    public async void InvisibleMyTestMethod()
    {
        await Task.Delay(1000);
        Assert.IsTrue(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我想要进行异步单元测试,则测试方法必须返回一个Task:

[TestMethod]
public async Task VisibleMyTestMethod()
{
    await Task.Delay(1000);
    Assert.IsTrue(true);
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?不是说我绝对需要async void测试方法,我只是好奇.构建async void测试方法时,Visual Studio 2012不会发出警告或错误,即使它无法运行...

c# unit-testing async-await c#-5.0 visual-studio-2012

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

如何在C#属性(注释)中放置Func?

我有一个C#注释,它是:

[AttributeUsage(AttributeTargets.Method)]
public class OperationInfo : System.Attribute {
    public enum VisibilityType {
        GLOBAL,
        LOCAL,
        PRIVATE
    }
    public VisibilityType Visibility { get; set; }
    public string Title { get; set; }
    public Func<List<string>, List<string>> Func;

    public OperationInfo(VisibilityType visibility, string title, Func<List<string>, List<string>> function) {
        Visibility = visibility;
        Title = title;
        Func = function;
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,有一个属性是Func,我想动态调用它.基本上,我想解析具有此注释的所有方法,然后调用绑定到注释的Func.

我想像这样使用它(这是一个echo函数的简单示例,它获取一个字符串并返回相同的字符串):

[OperationInfo(OperationInfo.VisibilityType.GLOBAL, "echo", IDoEcho)]
    public static string DoEcho(string a)
    {
        return a;
    }

    [OperationInfo(OperationInfo.VisibilityType.PRIVATE, null, null)]
    public static List<string> IDoEcho(List<string> param) {
        return new List<string>() …
Run Code Online (Sandbox Code Playgroud)

c# reflection attributes

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

将PCL转换为常规类库

我目前有一个Portable Class Library代码与常规完全兼容,Class Library没有任何修改.

我想知道是否有现有软件自动进行转换; 我查看了Visual Studio工具,但找不到任何合适的工具.在写我自己之前我只是想确定一下!

.net dll portable-class-library

21
推荐指数
2
解决办法
5571
查看次数

如何使用decimal.MaxValue进行测试?

考虑以下测试:

public void FooTest(decimal? val)
{
    Check.That(true).IsTrue();
}
Run Code Online (Sandbox Code Playgroud)

我想用极值(即MaxValueMinValue)来运行这个测试.

[TestCase(decimal.MaxValue)]
Run Code Online (Sandbox Code Playgroud)

这会输出以下错误:属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式

[TestCase(79228162514264337593543935)]
Run Code Online (Sandbox Code Playgroud)

我现在得到这个:积分常数太大了

最后一次绝望的尝试:

[TestCase(79228162514264337593543935M)]
Run Code Online (Sandbox Code Playgroud)

显然,由于强制转换,我得到了这个:属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式

如何用decimal.MaxValue参数编写单元测试?我可以为这个有问题的案例编写一个特定的测试,但我想知道是否有办法写TestCase这样的.

c# nunit unit-testing decimal

17
推荐指数
3
解决办法
2213
查看次数

除以2乘以0.5乘以

考虑以下:

void Foo(int start, int end)
{
    int mid = (start + end) / 2;
}

void Bar(int start, int end)
{
    int mid = (start + end) * 0.5;
}
Run Code Online (Sandbox Code Playgroud)

为什么Foo编译成功而不成功Bar?除以2隐式方式将结果转换为一段int时间乘以0.5得到的未转换double:

无法将类型'double隐式转换为int.存在显式转换(您是否错过了演员?)

这背后的C#语言设计师的推理是什么?

c#

10
推荐指数
2
解决办法
2319
查看次数

添加"winmd"引用与添加项目引用

我有一个Windows Phone 8项目和另一个用C++编写的项目; 两者都在同一个解决方案中.C++项目是WP8项目中使用的动态库,它被配置为.winmd.dll文件顶部生成Windows Metada文件().

在WP8项目中将C++项目添加为项目引用时,一切都运行良好.

但是,我想直接引用二进制文件而不是项目,所以我尝试引用.dll自身,但VS2012不会让我(我完全理解,因为库不受我理解的管理)..winmd相反,添加文件是有效的,我的意思是它编译时没有警告/错误; 但它在运行时崩溃(TargetInvocationException因为无法找到C++库的"实际"代码,我得到了一个).

添加.winmd文件时,我确保.dll文件旁边的文件.将这两个文件放在binWP8项目的目录中也不起作用.

我在互联网上找不到任何线索,如果你能给我一些,我将不胜感激,欢迎任何提示!

这是我正在尝试设置的简单架构的架构:

建筑

这是引发异常的堆栈跟踪:

at System.StubHelpers.StubHelpers.GetWinRTFactoryObject(IntPtr pCPCMD)
   at Sqlite.Sqlite3.sqlite3_open_v2(String filename, Database& db, Int32 flags, String zVfs)
   at SQLite.SQLite3.Open(String filename, Database& db, Int32 flags, IntPtr zVfs)
   at SQLite.SQLiteConnection..ctor(String databasePath, SQLiteOpenFlags openFlags, Boolean storeDateTimeAsTicks)
   at SQLite.SQLiteConnection..ctor(String databasePath, Boolean storeDateTimeAsTicks)
   at WP8ClassLibrary.SomeManager..ctor(String databasePath)
   at WP8App.SomeViewModel..ctor()
   at WP8App.MainPage..ctor()
Run Code Online (Sandbox Code Playgroud)

.net c# visual-studio visual-studio-2012 windows-phone-8

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

自定义查找和分组依据

TLDR:当使用查找的字段不为空时,为什么在查找中禁用group by子句?

我想对表单中的字段进行自定义查找.该表CTable如下所示:

Val Spec
------------
A   alpha
A   beta
A   gamma
B   delta
C   epsilon
Run Code Online (Sandbox Code Playgroud)

查找仅涉及Val使用具有基本关系的EDT定义的列:Val == CTable.Val

查找显然给了我一个这样的列表:

A
A
A
B
C
Run Code Online (Sandbox Code Playgroud)

让我们去一个小组来摆脱所有重复的As,我想!有点像:

QueryBuildDataSource.orderMode(OrderMode::GroupBy);
QueryBuildDataSource.addGroupByField(fieldNum(CTable, Val));
Run Code Online (Sandbox Code Playgroud)

现在出现了我的奇怪行为以及我的问题的实际观点.在一个空字段上,group by被正确执行,我得到了这个:

A
B
C
Run Code Online (Sandbox Code Playgroud)

现在让我们在查找中选择"A",然后再次执行查找,因为我想点击"B".现在,group by已被禁用,原因不明,我得到的结果与之前的结果相同.

为什么会这样?我怎么能克服这个?

x++ axapta dynamics-ax-2009

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

异步lambda中的参数

我试图同时运行几个任务,我遇到了一个似乎无法理解或解决的问题.

我以前有这样的功能:

private void async DoThings(int index, bool b) {
    await SomeAsynchronousTasks();
    var item = items[index];
    item.DoSomeProcessing();
    if(b)
        AVolatileList[index] = item; //volatile or not, it does not work
    else
        AnotherVolatileList[index] = item;
}
Run Code Online (Sandbox Code Playgroud)

我想用for循环调用Task.Run().但是我找不到向这个发送参数的方法,Action<int, bool>并且每个人都建议在类似的情况下使用lambdas:

for(int index = 0; index < MAX; index++) { //let's say that MAX equals 400 
    bool b = CheckSomething();
    Task.Run(async () => {
        await SomeAsynchronousTasks();
        var item = items[index]; //here, index is always evaluated at 400
        item.DoSomeProcessing();
        if(b)
            AVolatileList[index] …
Run Code Online (Sandbox Code Playgroud)

c# lambda asynchronous

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

将转换器应用于 Json 数组中的所有元素

可以通过定义如下类来使用自定义转换器:

public class MyCustomConverter : JsonConverter
{

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(MyCustomType);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var ret = new MyCustomType();
        return ret;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

MyCustomType item = JsonConvert.DeserializeObject<MyCustomType>(jsonString, new MyCustomTypeConverter());
Run Code Online (Sandbox Code Playgroud)

我的问题是,在处理 列表时如何应用这个反序列化器MyCustomType?基本上我有一个 Json 数组 ( [{ ... }, { ... }]),我想在数组的每个项目上使用上面的转换器来获取List<MyCustomType>.

我知道我可以使用该对象及其方法手动完成此操作JArray,但我想知道是否有更简单、更干净的方法来完成此操作。


这是一个简化的上下文。 …

c# json.net

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

带引用成员的struct:heap还是stack?

众所周知,a struct是一个值类型,因此被分配在堆栈上(例如,在类中装箱的特定情况除外).

但是让我们考虑一下struct:

public struct TestStruct
{
    public List<int> items;
}

internal class Program
{
    private static void Main(string[] args)
    {
        TestStruct g;
    }
}
Run Code Online (Sandbox Code Playgroud)

我们TestStruct g不是类的成员,而是Main函数中声明的"独立"变量.它符合stack分配变量的要求.

但是,如果我写:

g.items = new List<int>();
Run Code Online (Sandbox Code Playgroud)
  1. 我想items是分配的heap不是吗?是否g"走出去"的heap呢?
  2. 超出范围itemsg会发生什么(即 GC必须完成其工作items)?
  3. 如果不是List<int>我们有一个实现类型的变量IDisposable,那么最佳的行动方案是什么呢?

PS:我知道可以(应该?)class在这种情况下使用a 而不是a struct.我只是对这个具体案例感到困惑.

.net c# memory-management

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