小编Pio*_*fer的帖子

使用委托的"两级"泛型方法参数推断

请考虑以下示例:

class Test
{
    public void Fun<T>(Func<T, T> f)
    {
    }

    public string Fun2(string test)
    {
        return ""; 
    }

    public Test()
    {
        Fun<string>(Fun2);
    }
}
Run Code Online (Sandbox Code Playgroud)

编译好.

我想知道为什么我不能删除<string>泛型参数?我收到一个错误,无法从使用中推断出来.

我知道这样的推断对于编译器来说可能是一个挑战,但是它似乎是可能的.

我想解释一下这种行为.

编辑回答Jon Hanna的回答:

那么为什么会这样呢?

class Test
{
    public void Fun<T1, T2>(T1 a, Func<T1, T2> f)
    {
    }

    public string Fun2(int test)
    {
        return test.ToString(); 
    }

    public Test()
    {
        Fun(0, Fun2);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里我只绑定一个参数T1 a,但T2似乎同样困难.

c# generics type-inference

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

CSharpCodeProvider.CompileAssemblyFromFile中的最大错误数

CSharpCodeProvider用来编译我的应用程序的即时插件.

现在可以尝试编译一个看起来不错的文件,但会生成许多错误,例如粘贴二进制文件的C#代码.有许多字符,用处理error CS1056: Unexpected character.

这种行为是预期的,但是这种"恶意"文件的编译过程非常耗时.

我认为合理的一个解决方案是限制错误的数量,之后CSharpCodeProvider.CompileAssemblyFromFile返回.

是否可以设置这样的限制?

如果可以避免的话,我真的不想在第一时间仔细检查文件.

c# runtime-compilation

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

比较Type.GetProperties()和lambda表达式中的PropertyInfo

在创建我的测试框架时,我发现了一个奇怪的问题.

我想创建一个静态类,它允许我通过属性比较相同类型的对象,但有可能忽略其中的一些.

我希望有一个简单的流畅的API,所以TestEqualityComparer.Equals(first.Ignore(x=>x.Id).Ignore(y=>y.Name), second);如果给定的对象在除了Id和之外的每个属性上都是相等的,那么调用将返回true Name(它们不会被检查是否相等).

这是我的代码.当然这是一个微不足道的例子(缺少一些明显的方法重载),但我想提取最简单的代码.实际情况有点复杂,所以我真的不想改变方法.

该方法FindProperty几乎是来自AutoMapper库的复制粘贴.

用于流畅API的对象包装器:

public class TestEqualityHelper<T>
{
    public List<PropertyInfo> IgnoredProps = new List<PropertyInfo>();
    public T Value;
}
Run Code Online (Sandbox Code Playgroud)

流利的东西:

public static class FluentExtension
{
    //Extension method to speak fluently. It finds the property mentioned
    // in 'ignore' parameter and adds it to the list.
    public static TestEqualityHelper<T> Ignore<T>(this T value,
         Expression<Func<T, object>> ignore)
    {
        var eh = new TestEqualityHelper<T> { Value = value };

        //Mind …
Run Code Online (Sandbox Code Playgroud)

c# reflection equality

11
推荐指数
2
解决办法
2509
查看次数

如何打印当前的bash提示符?

问题很简单.我想评估PS1我的bash脚本中的当前值.

谷歌上的所有材料都指向了拉皮条的教程,但我想评估一下它将如何由我当前的终端呈现,或者至少由某个终端呈现.

是否有任何软/功能可以帮助我实现这一目标?当然我想要评估所有转义字符,所以echo $PS1在我的情况下这不是很有用.

bash prompt ps1

11
推荐指数
2
解决办法
7787
查看次数

IEqualityComparer未按预期工作

List我的计算机上存有一些文件路径.我的目的是首先筛选出具有相同名称的文件,然后筛选出具有相同大小的文件.
要做到这一点,我已经做了两个班实施IEqualityComparer<string>,并实现EqualsGetHashCode方法.

var query = FilesList.Distinct(new CustomTextComparer())
                     .Distinct(new CustomSizeComparer()); 
Run Code Online (Sandbox Code Playgroud)

这两个类的代码如下: -

public class CustomTextComparer : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        if (Path.GetFileName(x) == Path.GetFileName(y))
        {
            return true;
        }
        return false; 
    }
    public int GetHashCode(string obj)
    {
        return obj.GetHashCode();
    }
}
public class CustomSizeComparer : IEqualityComparer<string>
{
    public bool Equals(string x, string y)
    {
        if (new FileInfo(x).Length == new FileInfo(y).Length)
        {
            return true;
        }
        else
        {
            return false;
        }
    } …
Run Code Online (Sandbox Code Playgroud)

.net c# linq iequalitycomparer

10
推荐指数
3
解决办法
3403
查看次数

什么是在Global.asax中验证HTTP请求并返回特定HTTP响应的正确方法?

我正在尝试验证服务收到的HTTP请求.我想检查是否存在所有必需的标头等.如果没有,我想抛出一个异常,在某个地方,它会设置一个正确的响应代码和响应的状态行.我不想将用户重定向到任何特定的错误页面,只需发送答案.

我想知道我应该把代码放在哪里?我的第一个猜测是验证请求Application_BeginRequest,在错误上抛出异常并处理它Application_Error.

例如:

 public void Application_BeginRequest(object sender, EventArgs e)
 {
     if(!getValidator.Validate(HttpContext.Current.Request))
     {
         throw new HttpException(486, "Something dark is coming");
     }
 }

 public void Application_Error(object sender, EventArgs e)
 {
     HttpException ex = Server.GetLastError() as HttpException;
     if (ex != null)
     {
            Context.Response.StatusCode = ex.ErrorCode;
            Context.Response.Status = ex.Message;
     }
 }
Run Code Online (Sandbox Code Playgroud)

显然,在这种情况下,Visual Studio会抱怨未处理的异常Application_BeginRequest.它的工作原理,因为给定的代码返回给客户端,但我觉得这种方法有问题.

[编辑]:我已经删除了关于自定义状态行的第二个问题,因为这些问题并没有真正联系起来.

感谢帮助.

c# wcf global-asax

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

protobuf-net如何处理只读字段?

我使用protobuf-net来序列化/反序列化我的数据.

我有一些相当简单的类,所以这不是真正的问题.

据我所知,protobuf-net使用IL生成来创建序列化/反序列化代码.虽然我的模型中只有字段,但我想知道用IL写这样一个字段怎么可能?我可以清楚地看到它运作良好,但我不知道为什么......

我试图在代码中窥探它,但它有点太复杂了.

我自己尝试生成此类代码总是会导致IL验证程序错误.

c# il readonly protobuf-net

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

尽管处理结果和grep,如何在find中打印文件名

我有一个目录,包含要测试的文件A,比如文件BC.

为了简单起见,让我们假设我有一个命令我想在每个文件上发出并找到一个给我正确输出的命令.

我需要一个管道myCommand fileName | grep ExpectedResult(在我的实际情况下,我在库中寻找符号,所以它是readelf -s | grep MySymbol).

我想在命令结果上发出此find命令.

我找到了我的结果

find . -name *.so -print0 | xargs -0 myCommand | grep ExpectedResult
Run Code Online (Sandbox Code Playgroud)

这个工作正常,打印ExpectedResult.

我想要收到的是(假设我找的文件是B):

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

这样我就可以看到在哪个文件中找到了结果.如果我只是要grep文件的内容,我需要-print切换find.不幸的是,如果我需要管道命令,这是行不通的.

显然,grep -H也不会这样做,因为它只会说(standard input).

如何覆盖"outgrepping"文件名?不知何故在stderr上打印?

我意识到我可以将文件名保存在变量中,处理它等等,但我希望看到一个更简单的方法.

linux bash

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

重载转换运算符的转换规则

给出以下代码:

using System;

namespace Test721
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            Console.WriteLine(new A()); //prints 666
            Console.WriteLine(new B()); //prints 666
            Console.ReadLine();
        }
    }

    public class A
    {
        public static implicit operator int(A a)
        {
            return 666;
        }
    }

    public class B : A
    {
        public static implicit operator double(B b)
        {
            return 667;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果如评论中所示 - 两行都打印666.

我期望Console.WriteLine(new B());写667,而有一个double超载Console.WriteLine.

为什么会这样?

c# operator-overloading

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

"Item"属性以及索引器

我已经阅读了带有索引器和名为"Item"的属性的Class的答案,但是他们没有解释为什么我可以有一个带有多个索引器的类,所有这些都创建Item属性和get_Item/ set_Item方法(当然效果很好,因为它们不同重载),但我没有明确的Item属性.

考虑一下代码:

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
        }

        public int this[string val]
        {
            get
            {
                return 0;
            }
            set
            {
            }
        }

        public string this[int val] //this is valid
        {
            get
            {
                return string.Empty;
            }
            set
            {
            }
        }

        public int Item { get; set; } //this is not valid
    }
}
Run Code Online (Sandbox Code Playgroud)

对于两个索引器,创建了四种方法:

Int32 get_Item(String val)
Void set_Item(String val, Int32 value)
String get_Item(Int32 val) …
Run Code Online (Sandbox Code Playgroud)

c# indexer properties

6
推荐指数
0
解决办法
348
查看次数