假设我有一些内容类,如Page,TabGroup,Tab等。 其中一些将实现我的IWidgetContainer接口 - 这意味着他们将从界面中设置一个名为ContainedItems的附加字段以及一些操作该字段的方法。
现在我需要反映一些类通过在我的ASP.NET MVC视图中呈现一些特殊的自定义控件(如jQuery添加/删除/移动/重新排序按钮)来实现此接口的事实。
例如,TabGroup将实现IWidgetContainer,因为它将包含选项卡,但选项卡不会实现它,因为它不能包含任何内容。
所以我必须以某种方式检查我的视图,当我渲染我的内容对象时(问题是,我在我的视图中使用我的基类作为强类型而不是具体的类),是否它实现了IWidgetContainer。
这怎么可能或者我完全错过了什么?
要重新解释这个问题,您如何在UI中反映类的某些特殊属性(如接口实现)(不一定是ASP.NET MVC)?
到目前为止,这是我的代码:
[DataContract]
public class ContentClass
{
[DataMember]
public string Slug;
[DataMember]
public string Title;
[DataMember]
protected ContentType Type;
}
[DataContract]
public class Group : ContentClass, IWidgetContainer
{
public Group()
{
Type = ContentType.TabGroup;
}
public ContentList ContainedItems
{
get; set;
}
public void AddContent(ContentListItem toAdd)
{
throw new NotImplementedException();
}
public void RemoveContent(ContentListItem toRemove)
{
throw new NotImplementedException();
}
}
[DataContract]
public class GroupElement : ContentClass
{
public GroupElement()
{
Type = ContentType.Tab;
}
}
接口:
interface IWidgetContainer
{
[DataMember]
ContentList ContainedItems { get; set; }
void AddContent(ContentListItem toAdd);
void RemoveContent(ContentListItem toRemove);
}
答案 0 :(得分:3)
我认为你在寻找
void Foo(ContentClass cc)
{
if (cc is IWidgetContainer)
{
IWidgetContainer iw = (IWidgetContainer)cc;
// use iw
}
}
答案 1 :(得分:2)
我可能误解了您的问题,但使用is
关键字时出现问题?
<% if (obj is IWidgetContainer) { %>
<!-- Do something to render container-specific elements -->
<% } %>
答案 2 :(得分:0)
您可以在运行时检查类/接口是否来自另一个类/接口,如此
public static class ObjectTools
{
public static bool Implements(Type sourceType, Type implementedType)
{
if(implementedType.IsAssignableFrom(sourceType))
{
return true;
}
return false;
}
}
您需要做的就是将您正在检查的类型输入到sourceType参数(X)中,并将您要测试的类型输入到implementsType参数(Y)中,如下所示
Console.WriteLine(ObjectTools.Implements(typeof(X), typeof(Y)));