2

私は次のことを行う方法を理解するのに苦労しています:

厳密に型指定されたさまざまな IEnumerable オブジェクトを返すメソッドがいくつかあります。これらの厳密に型指定されたクラスは、Linq セレクターでアクセスしたいプロパティを公開する共通の基本クラスを共有します。

しかし、私はこれを機能させることができないようです。メソッドに基本型を渡すだけでは、IEnumerable をバインドするときにエラーが発生します。これは、派生クラスで使用できるプロパティが使用できないためです。

型を渡そうとすると、Linq 式が型を認識しないため、Linq 式で必要なプロパティにアクセスできません。

IEnumerable 型が基底クラスから派生したものであることを Linq 式に伝える必要があります。以下は、私がやろうとしていることの例です。

private IEnumerable<MyStronglyTypedResultSet> GetReportDetails()
{
  // this returns the IEnumerable of the derived type
}

public class MyBaseClass
{
    public Guid UserId {get; set;}
    public string OfficeName {get; set;}
}

public class MyStronglyTypedResultSet : MyBaseClass
{
   public string FullName {get; set;}
   public int Age {get; set;}
}

public void MyProblemMethod<T>(IEnumerable<T> allData, string officeToFind)
{
    // How do I tell Linq that my <T> type is derived from 'MyBaseClass' so I can access the 'OfficeName' property?

    IEnumerable<T> myData = allData.Where(c => c.OfficeName .ToLower().Equals(officeToFind.ToLower()));
    MyUsefulObject.DataSource= myData; // This needs to have access to the properties in 'MyStronglyTypedResultSet' 
    MyUsefulObject.DataaBind();
}
4

2 に答える 2

2

OfType拡張メソッドを使用できます。

public void MyProblemMethod<T>(IEnumerable<T> allData, string officeToFind)
{
    // How do I tell Linq that my <T> type is derived from 'MyBaseClass' so I can access the 'OfficeName' property?

    IEnumerable<T> myData = allData.OfType<MyBaseClass>.Where(c => c.OfficeName .ToLower().Equals(officeToFind.ToLower()));
    MyUsefulObject.DataSource= myData;
    MyUsefulObject.DataaBind();
}
于 2012-06-25T10:31:51.047 に答える
1

以下のようにメソッドを変更します

public void MyProblemMethod<T>(IEnumerable<T> allData, string officeToFind) where T : MyBaseClass
{
    // How do I tell Linq that my <T> type is derived from 'MyBaseClass' so I can access the 'OfficeName' property?

    IEnumerable<T> myData = allData.Where(c => c.OfficeName .ToLower().Equals(officeToFind.ToLower()));
    MyUsefulObject.DataSource= myData; // This needs to have access to the properties in 'MyStronglyTypedResultSet' 
    MyUsefulObject.DataaBind();
}
于 2012-06-25T10:29:06.770 に答える