簡體   English   中英

檢查子對象T的通用對象

[英]Check if generic object of subtype T

我試圖將以下內容重構為通用函數; 如果類型是在函數聲明中指定的,則下面的代碼示例對我有用。 但是,當我嘗試使用T時失敗。

我從外部應用程序中獲得了一個類似於IENumerable的對象,其中包含通用對象,因此我想過濾掉所討論的特定類型的對象。

對於上下文,這些是用戶在運行代碼之前在屏幕上選擇的幾何特征。 我需要驗證是否已選擇正確的事物類型,並將這些事物返回到干凈列表中。

具有定義類型的初始代碼可以正常工作:

    public static List<Point> GetSelectedPoints()
    {
        List<Point> tmp = new List<Point>();

        Selection oSel = GetSelectionObject();

        for (int i = 1; i <= oSel.Count; i++)
        {
            try
            {
                if (oSel.Item(i).Value is Point)
                {
                    Point P = (Point)oSel.Item(i).Value;
                    tmp.Add(P);
                }
            }
            catch
            {
                throw new Exception("An error occurred whilst retrieving the selection");
            }
        }

        return tmp;
    }

這里嘗試使用T:

    static public List<T> GetThisTypeFromSelection<T>()
    {

        Selection osel = GetSelectionObject();
        List<T> tmp= new List<T>();
        for(int i = 1; i<=osel.Count ; i++)
        {
            if (osel.Item(i).Value is T)
            {
                T thing = (T)osel.Item(i).Value;
                tmp.Add(tmp);
            }
        }
        return tmp;
    }

osel.Item(i).Value.GetType()返回“ System .__ ComObject” ...這沒有幫助。

外部應用程序的對象模型使得所有內容都從單個基類派生而來,它具有多層子類,如下所示:

    public class Base
{}

public class Geometry2d : Base
{ }
public class Line : Geometry2d
{ }
public class Circle : Line
{ }
public class Face : Geometry2d
{ }
public class PlanarFace : Face
{ }
public class CylindricalFace : Face
{ }
public class PlanarFaceDefinedThroughX : PlanarFace
{ }
public class PlanarFaceDefinedThroughY : PlanarFace
{ }
etcetera...

因此,選擇對象(同時也是從基本對象派生的)返回基本對象的列表,該列表可能是...幾乎任何東西。

根據此函數的應用程序,我可能想要獲取例如“ Face”或派生類的所有內容,或者僅是PlanarFaces,甚至只是PlanarFaceDefinedThroughXs。

選擇對象如下所示:


根據注釋進行更新(朝着正確的方向指向mm8)

    static public List<T> GetThisTypeFromSelection<T>()
    {

        Selection osel = GetSelectionObject();
        List<Base> listA = new List<Base>();
        for(int i = 1; i<=osel.Count ; i++)
        {
            CATBaseDispatch CbD = osel.Item(i).Value;
            listA.Add(CbD);
        }
        List<T> results = listA.Select(x => x).OfType<T>().ToList();

        return results;
    }

這種方法似乎可以成功過濾掉正確的對象類型-但是返回的列表仍然將它們顯示為COM對象...

在此處輸入圖片說明

如果您的Selection實現IEnumerable ,則可以使用Linq的OfType過濾所需類型的項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM