根据类名创建公共类对象并使用它

时间:2015-01-07 19:00:46

标签: c# asp.net .net linq

我在不同的类对象中使用相同的代码逻辑。

例如:

var matchingTypes = from matchType in order.Contacts
                         select matchType;

var matchingTypes = from matchType in customer.Contacts
                         select matchType;

我没有编写重复的代码行,而是希望传递订单,客户类名称并通过它获取联系人,以便上面的代码看起来像(我们在代码中使用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;
}

通过这样做,我重复我的代码,我想避免,任何建议/想法?感谢。

我想使用objectElement并只分配一次,这样我可以这样调用,如下所示

var matchingTypes = from matchType in objectElement.Contacts
                         select matchType;

2 个答案:

答案 0 :(得分:2)

接口是执行此操作的首选方法,但您也可以使用dynamic来键入方法:

public IEnumerable<Contact> GetContacts(dynamic yourObject) 
{
    return yourObject.Contacts;
}

请注意,如果您使用类型为Contacts的{​​{1}}属性但不会给出运行时错误的内容来调用它,则不会出现编译错误。< / p>

或者你甚至不需要一种方法,你可以这样做:

IEnumerable<Contact>

接口将是一个更安全的赌注,但生成实体框架类有点棘手。但你可以做到这一点,因为它们是var matchedTypes = ((dynamic)yourObject).Contacts as IEnumerable<Contact>; 类生成的。所以你可以这样做:

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;

答案 1 :(得分:1)

创建一个接口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;