2009-09-16 84 views
0

我试图实现一个IDescription接口。这个接口的基本目的是我有许多不同的类,它们有多种语言的描述列表,我希望基本的AddDescription EditDescription和其他一些基本行为由接口定义,而不是由继承接口的类实现。我正试图使用​​扩展方法将行为分配给接口。使用泛型和扩展方法的IDescription接口

我有一些路障,如我如何访问我传递到IDescription接口(entity.Descriptions.Add)的实体的描述集合?

我是非常新的泛型,扩展方法,匿名类型等,请容忍我与我如何使用这些误解。如果你能帮助我纠正下面的代码,将不胜感激。我写这篇文章是为了说明我正在努力达到的目标,它显然是基本的错误。由于

public class Company : IDescription<Company, CompanyDescription> 
{ 
    public IList<CompanyDescription> Desriptions { get; set; } 
} 

public class Location : IDescription<Location, LocationDescription> 
{ 
    public IList<LocationDescription> Desriptions { get; set; } 
} 


public interface IDescription<eT, dT> 
{ 
    void AddDescription(eT, string text); 
    void EditDescription(eT, dT, string text); 
} 

public static DescriptionInterfaceExtensions 
{ 

    public static void AddDescription(this IDescription<eT, dT> description, eT entity, string text) 
    { 
     dT newDescription = new dT(text); 
     entity.Descriptions.Add(newDescription); 
    } 
} 

回答

1

另一种可能重写,应该工作是删除添加/编辑方法从接口,并提供所需的IList在接口。然后,为了便于使用,您可以使用扩展方法使其更容易。

我不是说这个例子是一个伟大的使用泛型和扩展方法,但它会工作:

public class CompanyDescription : IDescription { public string Text { get; set; } } 
public class LocationDescription : IDescription { public string Text { get; set; } } 

public class Company : IHaveDescriptions<CompanyDescription> 
{ 
    public IList<CompanyDescription> Desriptions { get; set; } 
} 

public class Location : IHaveDescriptions<LocationDescription> 
{ 
    public IList<LocationDescription> Desriptions { get; set; } 
} 

public interface IDescription 
{ 
    string Text { get; set; } 
} 
public interface IHaveDescriptions<T> 
    where T : class, IDescription, new() 
{ 
    IList<T> Desriptions { get; set; } 
} 

public static class DescriptionInterfaceExtensions 
{ 
    public static void AddDescription<T>(this IHaveDescriptions<T> entity, string text) 
     where T : class, IDescription, new() 
    { 
     T newDescription = new T(); 
     newDescription.Text = text; 
     entity.Desriptions.Add(newDescription); 
    } 
    public static void EditDescription<T>(this IHaveDescriptions<T> entity, T original, string text) 
     where T : class, IDescription, new() 
    { 
     T newDescription = new T(); 
     newDescription.Text = text; 
     entity.Desriptions.Remove(original); 
     entity.Desriptions.Add(newDescription); 
    } 
} 
+0

这正是我要的,感谢您的时间 – kaivalya 2009-09-16 19:50:05

+0

有一个问题,我我跑到这里: 我有LocationDescription和CompanyDescription分开的原因是因为我有每个这些类的属性,将它们连接到父级,例如:CompanyDescription类具有公司类型的公司属性和LocationDescription具有位置类型的位置属性。我怎样才能将这些属性包含到这种方法中。我需要设置这些属性,但由于我们正在使用IDescription,所以我无法访问它们。 我有单独的具体子类实现,因为我使用nhibernate作为我的ORM。我认为 – kaivalya 2009-09-17 15:52:57

+0

IDescription也是通用的,但我认为这不适用于nhibernate映射... – kaivalya 2009-09-17 15:53:47

0

不能添加接口实现使用扩展方法的类,虽然这似乎是你正在尝试做的。

扩展方法的目的是将行为添加到现有类型(类或接口)。

您的代码存在的问题是您声明Company和Location应该实现IDescription接口;但他们没有。他们没有AddDescription或EditDescription方法,所以这不起作用。

为什么不定义一个具体的通用描述类并将该类附加到公司和位置?

1

我的例子看起来合同是具有描述的对象存储描述列表。因此,要避免在类直接申报添加和删除方法,你可以做这样的事情:

接口

public interface IDescription<T> 
{ 
} 

public interface IHasDescription<THasDescription, TDescription> 
    where THasDescription : IHasDescription<THasDescription, TDescription> 
    where TDescription : IDescription<THasDescription> 
{ 
    IList<TDescription> Descriptions { get; } 
} 

具体实现

public class CompanyDescription : IDescription<Company> 
{ 
} 

public class Company : IHasDescription<Company, CompanyDescription> 
{ 
    private readonly IList<CompanyDescription> descriptions; 

    public IList<CompanyDescription> Descriptions 
    { 
     get { return this.descriptions; } 
    } 
} 

扩展方法

public static class DescriptionExtensions 
{ 
    public static void AddDescription<THasDescription, TDescription>(
      this THasDescription subject, 
      TDescription description) 
     where THasDescription : IHasDescription<THasDescription, TDescription> 
     where TDescription : IDescription<THasDescription> 
    { 
     subject.Descriptions.Add(description); 
    } 
} 

但我不认为这是值得这样做只是为了有

mycompany.AddDescription(mydescription); 

,而不是

mycompany.Descriptions.Add(mydescription);