根据 class 名称创建通用 class 对象并使用它
Creating common class objects based on class name and use it
我在不同的 class 对象中使用相同的代码逻辑。
例如:
var matchingTypes = from matchType in order.Contacts
select matchType;
var matchingTypes = from matchType in customer.Contacts
select matchType;
我不想写重复的代码行,而是想传递订单、客户 class 姓名并通过它获取联系人,这样上面的代码看起来像(我们在代码中使用 LINQ)
var matchingTypes = from matchType in objectElement.Contacts
select matchType;
我试过的东西传递了一个对象参数
GetData(object objectElement) // method consuming an object parameter.
var objectOrder= objectElement as Orders;
var objectCustomer= objectElement as Customers;
if(objectOrder!=null)
{
objectElement = (Orders) objectOrder; //type
}
if(objectCustomer !=null)
{
objectElement = (Customers) objectCustomer;
}
通过这样做,我重复了我想避免的代码,任何 suggestions/ideas?谢谢。
我想使用 objectElement 并只分配一次,这样我就可以像下面这样调用
var matchingTypes = from matchType in objectElement.Contacts
select matchType;
创建接口 IContactsContainer:
public interface IContactsContainer
{
public YourContactType Contacts{get;set;}
}
那么你的客户和订单类就可以实现了:
public class Customers : IContactsContainer
{
public YourContactType Contacts {get;set;}
....
}
public class Orders: IContactsContainer
{
public YourContactType Contacts {get;set;}
....
}
之后在你的方法中你可以使用:
IContactsContainer objectElement = yourOrderObject;
接口是执行此操作的首选方法,但您也可以使用 dynamic
来回避类型方法:
public IEnumerable<Contact> GetContacts(dynamic yourObject)
{
return yourObject.Contacts;
}
请注意,如果您使用不具有类型 IEnumerable<Contact>
的 属性 调用的 Contacts
来调用它,这不会给您带来编译错误,而是会给您一个运行时错误。
或者你甚至不需要一个方法,你可以这样做:
var matchedTypes = ((dynamic)yourObject).Contacts as IEnumerable<Contact>;
接口会是一个更安全的选择,但是生成 entity framework 类 有点棘手。但是你可以这样做,因为它们生成为 partial
类。所以你可以这样做:
public interface IHaveContacts
{
public IEnumerable<Contact> Contacts { get; }
}
然后:
public partial class Orders : IHaveContacts
{
// should need to do anything since the auto-genrated Contacts property
// will satisfy the interface
}
public partial class Customers : IHaveContacts
{
// ditto
}
现在您可以:
var matchedTypes = ((IHaveContacts)yourObject).Contacts;
或者,如果你真的,真的必须(你不需要):
var matchedTypes = from matchType in ((IHaveContacts)yourObject).Contacts
select matchType;
我在不同的 class 对象中使用相同的代码逻辑。
例如:
var matchingTypes = from matchType in order.Contacts
select matchType;
var matchingTypes = from matchType in customer.Contacts
select matchType;
我不想写重复的代码行,而是想传递订单、客户 class 姓名并通过它获取联系人,这样上面的代码看起来像(我们在代码中使用 LINQ)
var matchingTypes = from matchType in objectElement.Contacts
select matchType;
我试过的东西传递了一个对象参数
GetData(object objectElement) // method consuming an object parameter.
var objectOrder= objectElement as Orders;
var objectCustomer= objectElement as Customers;
if(objectOrder!=null)
{
objectElement = (Orders) objectOrder; //type
}
if(objectCustomer !=null)
{
objectElement = (Customers) objectCustomer;
}
通过这样做,我重复了我想避免的代码,任何 suggestions/ideas?谢谢。
我想使用 objectElement 并只分配一次,这样我就可以像下面这样调用
var matchingTypes = from matchType in objectElement.Contacts
select matchType;
创建接口 IContactsContainer:
public interface IContactsContainer
{
public YourContactType Contacts{get;set;}
}
那么你的客户和订单类就可以实现了:
public class Customers : IContactsContainer
{
public YourContactType Contacts {get;set;}
....
}
public class Orders: IContactsContainer
{
public YourContactType Contacts {get;set;}
....
}
之后在你的方法中你可以使用:
IContactsContainer objectElement = yourOrderObject;
接口是执行此操作的首选方法,但您也可以使用 dynamic
来回避类型方法:
public IEnumerable<Contact> GetContacts(dynamic yourObject)
{
return yourObject.Contacts;
}
请注意,如果您使用不具有类型 IEnumerable<Contact>
的 属性 调用的 Contacts
来调用它,这不会给您带来编译错误,而是会给您一个运行时错误。
或者你甚至不需要一个方法,你可以这样做:
var matchedTypes = ((dynamic)yourObject).Contacts as IEnumerable<Contact>;
接口会是一个更安全的选择,但是生成 entity framework 类 有点棘手。但是你可以这样做,因为它们生成为 partial
类。所以你可以这样做:
public interface IHaveContacts
{
public IEnumerable<Contact> Contacts { get; }
}
然后:
public partial class Orders : IHaveContacts
{
// should need to do anything since the auto-genrated Contacts property
// will satisfy the interface
}
public partial class Customers : IHaveContacts
{
// ditto
}
现在您可以:
var matchedTypes = ((IHaveContacts)yourObject).Contacts;
或者,如果你真的,真的必须(你不需要):
var matchedTypes = from matchType in ((IHaveContacts)yourObject).Contacts
select matchType;