2012-11-19 60 views
0

可能重複:
C# -Generics Help我可以爲這種情況創建一個通用基類嗎?還有其他建議嗎?

讓我們先從這個接口伊巴爾如下。

public interface IBar<T> : IQueryable<T>, IEnumerable<T> where T : class 
    { 

    } 

我有以下3類Bar1,Bar2和Bar3。

public class Bar1 
    { 

    } 

    public class Bar2 
    { 

    } 

    public class Bar3 
    { 

    } 

然後,我有所謂的IFoo另一個接口包含通用IBAR每個上述三類,如下所示。

public interface IFoo 
    { 
     IBar<Bar1> Bar1 { get; set; } 
     IBar<Bar2> Bar2 { get; set; } 
     IBar<Bar3> Bar3 { get; set; } 
    } 

最後,我有三個類Foo1Sample,Foo2Sample和Foo3Sample。每個這個類都包含一個IFace接口的實例,並且還有一個返回IQueryable的Data屬性,如下所示。

public class Foo1Sample 
    { 
     IFoo foo; 

     public IQueryable<Bar1> Data 
     { 
      get { return foo.Bar1; } 
     } 
    } 

    public class Foo2Sample 
    { 
     IFoo foo; 

     public IQueryable<Bar2> Data 
     { 
      get { return foo.Bar2; } 
     } 
    } 

    public class Foo3Sample 
    { 
     IFoo foo; 

     public IQueryable<Bar3> Data 
     { 
      get { return foo.Bar3; } 
     } 
    } 

我只是想知道如果我可以創建可用於Foo1Sample,Foo2Sample和Foo3Sample這樣的數據屬性可以從IFoo的接口返回適當類型的基類。

+0

不是真的,因爲你的'Sample'每個類返回的IFoo的不同* *財產。泛型僅抽象類型。 – millimoose

回答

0

你可能有這樣的事情

public interface IBar<T> : IQueryable<T>, IEnumerable<T> where T : class 
{ 
    T Bar { get; set;} 
} 

public class Foo<T> 
{ 
    IFoo<T> foo; 

    public IQueryable<T> Data 
    { 
     get { return foo.Bar; } 
    } 
} 
0

想到的最接近的是一樣的東西: 類FooGenericSample { Func鍵_getter; 012ooIFoo _foo;

public FooGenericSample(Func<IFoo, TBar> getter) { 
     _getter = getter; 
    } 

    public IQueryable<TBar> Data { 
     get { 
      return _getter(_foo); 
     } 
    } 
} 

// ... 

var foo1Sample = new FooGenericSample(f => f.Bar1); 
// foo2Sample etc. 

這可以避免樣板實例的樣板訪問不同,並且只允許樣本實例的屬性訪問不同。如果你需要的是Data財產,我只是傳遞一個Func<IBar<T>>各地直接:

var func =() => foo.Bar1; 
0

,如果你能有IFoo只有一個Bar屬性這隻會工作。如果不是,那麼你什麼都做不了。

public interface IBar<T> : IQueryable<T>, IEnumerable<T> where T : class 
{ 

} 
public interface IFoo<T> where T : IBar 
{ 
    IBar<T> Bar { get; set; } 
} 

,然後要麼

public class Foo1Sample 
{ 
    IFoo<Bar1> foo; 

    public IQueryable Data 
    { 
     get { return foo.Bar; } 
    } 
} 

public class FooSample<T> where T: IBar 
{ 
    IFoo<T> foo; 

    public IQueryable Data 
    { 
     get { return foo.Bar; } 
    } 
} 
相關問題