0

可能重复:
C# -Generics 帮助

让我们从这个接口 IBar 开始,如下所示。

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 的基类,以便 Data 属性可以从该 IFoo 接口返回适当的类型。

4

3 回答 3

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; }
    }
}
于 2012-11-19T19:58:46.900 回答
0

想到的最接近的事情是:class FooGenericSample { Func _getter; IFoo _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;
于 2012-11-19T20:04:05.643 回答
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; }
    }
}
于 2012-11-19T20:18:41.997 回答