我遇到了一个让我觉得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#中你可以写:
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中会是什么样子?
我有一些使用扩展方法的代码,但是使用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?
我听说有可能使用扩展方法,但我自己也无法弄明白.如果可能的话,我想看一个具体的例子.
谢谢!
我碰巧看到了一些代码,其中这个人将lambda表达式传递给ArrayList.Sort(这里是IComparer)或IEnumerable.SequenceEqual(IEnumerable列表,IEqualityComparer here),其中需要IComparer或IEqualityComparer.
我不能确定我是否看过它,或者我只是在做梦.我似乎无法在这些集合中找到任何接受Func <>或其方法签名中的委托的扩展.
有这样的过载/扩展方法吗?或者,如果没有,是否有可能像这样捣乱并传递一个算法(读委托),其中预期单方法接口?
更新 谢谢大家.那正是我所想.我一定是在做梦.我知道如何编写转换.我只是不确定我是否见过这样的东西,或者只是觉得我已经看过了.
又一次更新 看,在这里,我找到了一个这样的实例.毕竟我并没有做梦.看看这家伙在这做什么.是什么赋予了?
这是另一个更新:
好的,我明白了.那家伙正在使用Comparison<T>超载.尼斯.很好,但完全容易误导你.不过很好.谢谢.
linq ienumerable extension-methods icomparer iequalitycomparer
在vs2008中,是否可以编写适用于任何枚举的扩展方法.
我知道你可以针对特定的枚举编写扩展方法,但我希望能够使用单个扩展方法进行每个枚举.这可能吗?
我正在尝试简单地将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- 即使使用扩展方法.
我正在为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) 我们都熟悉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)
有了这些扩展方法,你需要声明和引发一个事件就像这样: …
任何人都可以帮助我(非通用接口)的Count扩展方法IEnumerable.
我知道LINQ不支持它但是如何手动编写它?
c# ×6
.net ×4
ienumerable ×2
linq ×2
.net-3.5 ×1
asp.net ×1
asp.net-mvc ×1
data-binding ×1
enumeration ×1
enums ×1
events ×1
html-helper ×1
icomparer ×1
lambda ×1
mixins ×1
msbuild ×1
recursion ×1
repeater ×1
scala ×1