1

基本クラス にVideoContainerは、 のリストが含まれていますVideoContainers

VideoContainer のプロパティは、他の 3 つのクラスに共通です。そのうちの 3 つは次のとおりです。

  • Layout
  • Perspective
  • Source

これらのクラスにはそれぞれ異なるプロパティがあり、VideoContainersコレクション内に収まる必要があります。

/// <summary>
/// Video container
/// </summary>
public class VideoContainer<T>
{
    /// <summary>
    /// Container ID
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    /// Type of container - {Layout, Perspective, SourceContainer}
    /// 
    /// This is usually set by the instantiated class.
    /// </summary>
    public ContainerTypes ContainerType { get; set; }

    /// <summary>
    /// Parent ID
    /// </summary>
    public VideoContainerIdentifier ParentObject { get; set; }

    /// <summary>
    /// Name of container
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// Details about the physical location of this container
    /// </summary>
    public LocationDefinition LocationDefinition { get; set; }

    /// <summary>
    /// When container has a tile applied - number of rows of containers within this perspective
    /// </summary>
    public short NumRows { get; set; }

    /// <summary>
    /// When container has a tile aplpied - the number of columns of containers within this perspective
    /// </summary>
    public short NumColumns { get; set; }


    /// <summary>
    /// List of containers
    /// </summary>
    public IList<VideoContainer<T>> VideoContainers { get; set; }


    /// <summary>
    /// Draw
    /// </summary>
    public virtual void Draw()
    {
        // drawing tasks
    }

}

最初の問題は、VideoContainers コレクションが VideoContainer の型を想定しているため、VideoContainers コレクション内に Layout (または他のクラス型) を配置できないことでした。

だから私は追加<T>しましたが、タイプのプロパティにアクセスするのに問題がありましたが、うまくいき<T>ませんでした。

これを正しく設定するにはどうすればよいですか?

- アップデート -

私が言及するのを忘れていたのは、クラスはすべて継承するということVideoContainersです。

以下の提案に従って、作成しましpublic interface IVideoContainer<T>た。

Layout クラスは次のように定義され public class Layout : IVideoContainer<Layout>、インターフェイスのすべてのメソッドを実装します。

public class Layout : IVideoContainer<Layout>
{
    /// <summary>
    /// ctor
    /// </summary>
    public Layout()
    {
        ContainerType = ContainerTypes.Layout;
    }

    public int Id
    {...

問題は実装にあります:

        var layout = new IVideoContainer<Layout>
            {
                Id = 1,
                ParentObject = null,
                Name = "Layout Definition 1",
                LocationDefinition = new LocationDefinition
                    {
                        TopLeftX = 0,
                        TopLeftY = 0,
                        WidthPixels = 1000,
                        HeightPixels = 1000
                    },
                NumRows = 20,
                NumColumns = 20,
                VideoContainers = new List<Perspective>
                    {
                        new IVideoContainer<Perspective>
                        {
                            Id = 10, ...

-- 更新 2 --

私は今持っています:

/// <summary>
/// VideoContainer
/// </summary>
/// <typeparam name="T"></typeparam>
public class VideoContainer<T> : IVideoContainer
{
    public int Id { get; set; }
    public ContainerTypes ContainerType { get; set; }
    public VideoContainerIdentifier ParentObject { get; set; }
    public string Name { get; set; }
    public LocationDefinition LocationDefinition { get; set; }
    public short NumRows { get; set; }
    public short NumColumns { get; set; }
    public IList<IVideoContainer> VideoContainers { get; set; }
}

問題は、SourceContainer にアクセスできない新しいプロパティが含まれていることCctvIdですStreamUri

VideoContainers = new List<VideoContainer<SourceContainer>>
    {
        new VideoContainer<SourceContainer>
            {
                Id = 20,
                ParentObject = new VideoContainerIdentifier
                    {
                        Id = 10,
                        ContainerType = ContainerTypes.Perspective
                    },
                ContainerType = ContainerTypes.SourceContainer,
                CctvId = new Guid(),
                StreamUri = new Uri("http://127.0.0.1/somestream"),
                LocationDefinition = new LocationDefinition     // TODO: verify that {x,y} are relative to the perspective
                    {
                        TopLeftX = 0,
                        TopLeftY = 0,
                        WidthPixels = 10,
                        HeightPixels = 10                                                        
                    }

            },

SourceContainer クラス:

public class SourceContainer : IVideoContainer
{
    /// <summary>
    /// the URI of the stream for this source
    /// </summary>
    public Uri StreamUri { get; set; }

    /// <summary>
    /// the descriptive name of this source
    /// </summary>
    //public string Name { get; set; }

    /// <summary>
    /// optional device id for this source
    /// </summary>
    public Guid? CctvId { get; set; }

    /// <summary>
    /// ctor
    /// </summary>
    public SourceContainer()
    {
        ContainerType = ContainerTypes.SourceContainer;
    }

    public int Id { get; set; }
    public ContainerTypes ContainerType { get; set; }
    public VideoContainerIdentifier ParentObject { get; set; }
    public string Name { get; set; }
    public LocationDefinition LocationDefinition { get; set; }
    public short NumRows { get; set; }
    public short NumColumns { get; set; }
    public IList<IVideoContainer> VideoContainers { get; set; }
}
4

1 に答える 1

3

共通のプロパティを収集するインターフェイスを作成し、それを 3 つのクラスに継承させてから、T をインターフェイスにキャストしてプロパティにアクセスします。

public class VideoContainer: IVideoContainer
{
    public List<IVideoContainer> Children { get; set; }
}

リストに保存しているオブジェクトに固有のプロパティにアクセスする場合は、元のオブジェクトにキャストするだけです。

var child = Children.First();
var type = m.GetType();
if(type.Name == "ChildClass")
{
    var container = (ChildClass)child;
    // Now you can access VideoContainer specific properties in `container`.
}
于 2013-10-03T14:02:18.457 に答える