好的,这有点复杂,所以让我解释一下。
我在现有项目中有几个具有不同联系信息的类。例如,CompanyContact可能包含
1. CompanyName
2. Phone
3. Fax
ProviderContact可能有
1. ProviderName
2. FirstName,
3. LastName,
4. Phone,
5. Fax
和ProviderLocation可能有
1. Name (location name)
2. Phone1
3. Fax1
每个类都有其他属性,这只是一个子集。有些字段意思相同,但命名不同。 CompanyName,ProviderName和Name(在ProviderLocation中)都意味着相同的东西,就像Phone和Phone1是相同的(至少对我来说)。
我创建了一个接口IFaxContact,试图为所有这些类提供一个通用接口,因为我需要在不同情况下从它们那里获取联系信息,以便自动化传真和电子邮件。
public interface IFaxContact
{
string EntityName { get; set;}
string FullName {get; set;}
string Email { get; set;}
string Fax { get; set;}
string Phone { get; set;}
}
我在所有相关类中明确地实现了这一点,但是如果该属性已经存在,我没有再添加它,因为现有属性将用于所有实现。
我目前有一个工厂类,它正在创建单个类并返回IFaxContact或List<IFaxContact>
的对象。这在大多数情况下运作良好。
现在,我有一个ListView控件,我将List<IFaxContact>
绑定为数据源。当它进行绑定时,它将对象称为基类(即CompanyContact)而不是接口IFaxContact,并且由于该字段不存在而给出错误。我试图将它绑定到IFaxContact的绑定表达式,但它没有接受它。
<asp:ListView ID="lvRecipients" runat="server" OnItemCommand="lvRecipients_ItemCommand">
<LayoutTemplate>
<ul style="list-style: none;">
<li runat="server" id="itemPlaceholder"></li>
</ul>
</LayoutTemplate>
<ItemTemplate>
<li>**<span style="width: 100px; margin-right: 2px;"><%# Eval("FullName") %></span>
<span style="width: 100px; margin-right: 2px;"><%# DataBinder.Eval((Entities.IFaxContact)Container.DataItem, "EntityName")%></span>
<span style="width: 50px; margin-right: 2px;"><%# Eval("Fax") %></span>
<span style="width: 50px;">**
<a href="#" runat="server" onclick="lnkAddOtherRecipient_Click">
<i class="fa faGreen fa-plus fa-lg "></i>
</a>
</span>
</li>
</ItemTemplate>
</asp:ListView>
绑定正在上面的ItemTemplate中完成。
我得到的错误是: System.Web.HttpException(0x80004005):DataBinding:'Entities.CompanyContact'不包含名为'EntityName'的属性。
这是因为EntityName存在于IFaxContact下,而不存在于类(即CompanyContact)中,但DataItem的类型为CompanyContact(或其他类之一)。
我需要一些帮助来弄清楚如何正确地将Eval(...)表达式中的Container.DataItem强制转换为IFaxContact,或者另外一个解决方案将与我目前设计的界面一起使用。
由于