作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我有一个对象层次结构来在 asp.net mvc 中生成 ui 控件并尝试实现流畅的 api。我做了一些虚拟类(class)来专注于当前的问题。
所以这是“错误”的代码库:
public abstract class HtmlElement { /* ... */ }
public abstract class UIElement : HtmlElement { /* ... */ }
public abstract class ButtonBase : UIElement { /* ... */ }
public class LinkButton : ButtonBase { /* ... */ }
public class ActionButton : ButtonBase { /* ... */ }
public static class HtmlElementExtensions
{
public static T Id<T>(this T item, string id) where T : HtmlElement
{
/* set the id */
return item;
}
}
public static class ButtonBaseExtensions
{
public static T Id<T>(this T item, string id) where T : ButtonBase
{
/* set the id and do some button specific stuff*/
return item;
}
}
LinkButton lb = new LinkButton().Id("asd");
public static T Id<T>(this T item, string id) where T : HtmlElement
{
if (item is ButtonBase)
{
/* do some button specific stuff*/
}
/* set the id */
return item;
}
public class BaseClass { /*...*/ }
public class InheritedClass : BaseClass { /*...*/ }
public static class BaseClassExtensions
{
public static void SomeMethod(this BaseClass item, string someParameter)
{
Console.WriteLine(string.Format("BaseClassExtensions.SomeMethod called wtih parameter: {0}", someParameter));
}
}
public static class InheritedClassExtensions
{
public static void SomeMethod(this InheritedClass item, string someParameter)
{
Console.WriteLine(string.Format("InheritedClassExtensions.SomeMethod called wtih parameter: {0}", someParameter));
}
}
BaseClass bc = new BaseClass();
InheritedClass ic = new InheritedClass();
BaseClass ic_as_bc = new InheritedClass();
bc.SomeMethod("bc");
ic.SomeMethod("ic");
ic_as_bc.SomeMethod("ic_as_bc");
BaseClassExtensions.SomeMethod called wtih parameter: bc
InheritedClassExtensions.SomeMethod called wtih parameter: ic
BaseClassExtensions.SomeMethod called wtih parameter: ic_as_bc
最佳答案
您可以查看有关扩展方法的 MSDN 文档:Extension Methods (C# Programming Guide) .有趣的部分是在编译时绑定(bind)扩展方法下:
... it first looks for a match in the type's instance methods. If no match is found, it will search for any extension methods that are defined for the type, and bind to the first extension method that it finds.
public static T Id<T>(this T item, string id) where T : object
.如果你不会看到任何编译器错误,你会认为一切都是正确的,也许一切都会工作,除了一些极少数情况。会有多困惑?
HtmlElementExtensions
和
ButtonBaseExtensions
中的一个什么会阻止我这样做
HtmlElementExtensions.Id(button, "id")
而不是
ButtonExtensions.Id(button, "id")
?
public static T Id<T>(this T item, string id) where T : HtmlElement
{
if (item is ButtonBase)
{
return (T)Id((ButtonBase)item);
}
else if (item is HtmlElement)
{
return (T)Id((HtmlElement)item);
}
throw new NotSupportedException("Type " + item.GetType() + " is not supported by Id extension method");
}
private static ButtonBase Id(ButtonBase item, string id)
{
return item;
}
private static HtmlElement Id(HtmlElement item, string id)
{
return item;
}
关于.net - 如何在 .NET 中使用 "override"扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16140543/
我是一名优秀的程序员,十分优秀!