标签: extension-methods

在C#中使用扩展方法时出错

我遇到了一个让我觉得3.0框架中存在错误的问题.当我尝试使用扩展方法时,我收到以下错误:

Missing compiler required member
'System.Runtime.CompilerServices.ExtensionAttribute..ctor'
Run Code Online (Sandbox Code Playgroud)

使用这个简单的代码时:

public static class StringUtils {
    static void TestExtension(this String targetString) {

    }
}
Run Code Online (Sandbox Code Playgroud)

使编译错误消失的唯一方法是添加以下代码:

namespace System.Runtime.CompilerServices {
    public class ExtensionAttribute : Attribute { }
}
Run Code Online (Sandbox Code Playgroud)

我使用扩展方法已经有几个月,但我很确定我不必这样做.还有其他人遇到过这个问题吗?

c# extension-methods .net-3.5

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

Scala相当于C#的扩展方法?

在C#中你可以写:

using System.Numerics;
namespace ExtensionTest {
public static class MyExtensions {
    public static BigInteger Square(this BigInteger n) {
        return n * n;
    }
    static void Main(string[] args) {
        BigInteger two = new BigInteger(2);
        System.Console.WriteLine("The square of 2 is " + two.Square());
    }
}}
Run Code Online (Sandbox Code Playgroud)

这个简单的扩展方法在Scala中会是什么样子?

extension-methods scala

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

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

我有一些使用扩展方法的代码,但是使用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万
查看次数

是否可以在C#中实现mixins?

我听说有可能使用扩展方法,但我自己也无法弄明白.如果可能的话,我想看一个具体的例子.

谢谢!

c# extension-methods mixins

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

传递lambda表达式代替IComparer或IEqualityComparer或任何单方法接口?

我碰巧看到了一些代码,其中这个人将lambda表达式传递给ArrayList.Sort(这里是IComparer)或IEnumerable.SequenceEqual(IEnumerable列表,IEqualityComparer here),其中需要IComparer或IEqualityComparer.

我不能确定我是否看过它,或者我只是在做梦.我似乎无法在这些集合中找到任何接受Func <>或其方法签名中的委托的扩展.

有这样的过载/扩展方法吗?或者,如果没有,是否有可能像这样捣乱并传递一个算法(读委托),其中预期单方法接口?

更新 谢谢大家.那正是我所想.我一定是在做梦.我知道如何编写转换.我只是不确定我是否见过这样的东西,或者只是觉得我已经看过了.

又一次更新 看,在这里,我找到了一个这样的实例.毕竟我并没有做梦.看看这家伙这做什么.是什么赋予了?

这是另一个更新: 好的,我明白了.那家伙正在使用Comparison<T>超载.尼斯.很好,但完全容易误导你.不过很好.谢谢.

linq ienumerable extension-methods icomparer iequalitycomparer

56
推荐指数
6
解决办法
4万
查看次数

枚举扩展方法

在vs2008中,是否可以编写适用于任何枚举的扩展方法.

我知道你可以针对特定的枚举编写扩展方法,但我希望能够使用单个扩展方法进行每个枚举.这可能吗?

.net extension-methods enums enumeration

54
推荐指数
4
解决办法
5万
查看次数

ASP.NET转发器交替行突出显示没有完全烧断<alternatingitemtemplate />

我正在尝试简单地将css类添加到我的备用行中的div上,<itemtemplate/>而不会包含完全爆炸的开销,<alternatingitemtemplate/>这将迫使我在将来保持大量标记同步.

我见过一个解决方案,比如http://blog.net-tutorials.com/2009/04/02/how-to-alternate-row-color-with-the-aspnet-repeater-control/我是很想使用,但这对我来说仍然没有"闻到".

有没有其他人有一个更可维护和直接的解决方案?理想情况下,我希望能够做到这样的事情:

<asp:repeater id="repeaterOptions" runat="server">
        <headertemplate>
            <div class="divtable">
                <h2>Other Options</h2>
        </headertemplate>
        <itemtemplate>
                <div class="item <%# IsAlternatingRow ? "dark" : "light" %>">
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何实现IsAlternatingRow- 即使使用扩展方法.

c# asp.net data-binding extension-methods repeater

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

在HtmlHelper的扩展方法中从传递的lambda表达式获取属性值的最简单方法是什么?

我正在为HtmlHelper编写一个脏的小扩展方法,以便我可以说HtmlHelper.WysiwygFor(lambda)之类的内容并显示CKEditor.

我现在有这个工作,但它似乎比我想要的更麻烦.我希望有更直接的方式来做到这一点.

这是我到目前为止所拥有的.

public static MvcHtmlString WysiwygFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
{
    return MvcHtmlString.Create(string.Concat("<textarea class=\"ckeditor\" cols=\"80\" id=\"",
                                        expression.MemberName(), "\" name=\"editor1\" rows=\"10\">", 
                                        GetValue(helper, expression),
                                        "</textarea>"));
}

private static string GetValue<TModel, TProperty>(HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression)
{
    MemberExpression body = (MemberExpression)expression.Body;
    string propertyName = body.Member.Name;
    TModel model = helper.ViewData.Model;
    string value = typeof(TModel).GetProperty(propertyName).GetValue(model, null).ToString();
    return value;
}

private static string MemberName<T, V>(this Expression<Func<T, V>> expression)
{
    var memberExpression = expression.Body as MemberExpression;
    if (memberExpression == null)
            throw new InvalidOperationException("Expression must …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc recursion lambda extension-methods html-helper

54
推荐指数
4
解决办法
3万
查看次数

使用扩展方法提升C#事件 - 这很糟糕吗?

我们都熟悉C#事件声明的恐怖.为了确保线程安全,标准是写这样的东西:

public event EventHandler SomethingHappened;
protected virtual void OnSomethingHappened(EventArgs e)
{            
    var handler = SomethingHappened;
    if (handler != null)
        handler(this, e);
}
Run Code Online (Sandbox Code Playgroud)

最近在这个板上的一些其他问题(我现在找不到),有人指出在这种情况下可以很好地使用扩展方法.这是一种方法:

static public class EventExtensions
{
    static public void RaiseEvent(this EventHandler @event, object sender, EventArgs e)
    {
        var handler = @event;
        if (handler != null)
            handler(sender, e);
    }
    static public void RaiseEvent<T>(this EventHandler<T> @event, object sender, T e)
        where T : EventArgs
    {
        var handler = @event;
        if (handler != null)
            handler(sender, e);
    }
}
Run Code Online (Sandbox Code Playgroud)

有了这些扩展方法,你需要声明和引发一个事件就像这样: …

.net c# events extension-methods event-handling

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

计算IEnumerable的计数(非通用)

任何人都可以帮助我(非通用接口)的Count扩展方法IEnumerable.

我知道LINQ不支持它但是如何手动编写它?

.net c# linq ienumerable extension-methods

46
推荐指数
2
解决办法
4万
查看次数