0

重複の可能性:
C#-ジェネリックヘルプ

以下のように、このインターフェース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
    {

    }

次に、以下に示すように、上記の3つのクラスのそれぞれに対応する汎用IBarを含むIFooという別のインターフェイスがあります。

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

最後に、Foo1Sample、Foo2Sample、Foo3Sampleの3つのクラスがあります。この各クラスには、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; }
        }
    }

DataプロパティがそのIFooインターフェイスから適切な型を返すことができるように、Foo1Sample、Foo2Sample、およびFoo3Sampleに使用できる基本クラスを作成できるかどうか疑問に思っていました。

4

3 に答える 3

0

頭に浮かぶ最も近いものは次のようなものです。classFooGenericSample{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を 1 つしか持てない場合にのみ機能し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 に答える
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 に答える