基于类名创建公共类对象并使用它

本文关键字:对象 于类名 创建 | 更新日期: 2023-09-27 18:36:42

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

例如:

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;

基于类名创建公共类对象并使用它

接口

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

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

请注意,如果您使用没有名为 IEnumerable<Contact> 类型的属性Contacts 的属性调用它,这不会给您带来编译错误,而是会给您一个运行时错误。

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

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;

或者,如果你真的,真的必须(你没有):

var matchedTypes = from matchType in ((IHaveContacts)yourObject).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;