创建通用DependencyProperty

时间:2014-10-15 15:01:02

标签: c# generics dependency-properties

我有一个泛型类,它采用模板T,它应该是一个不可为空的对象:

class Point<T> where T : struct
{
    public T x;
    public T y;
}

由于我不会进入这里的原因,我真的需要T成为struct,而不是任何对象或类。

我想创建一个UserControl,其中包含此类的实例为DependencyProperty,例如:

public class MyUserControl : UserControl
{
     static MyUserControl () {}


    public static readonly DependencyProperty PointDependencyProperty = 
        DependencyProperty.Register(
          "MyPoint",
          typeof(Point<???>),  // This is the problem!
          typeof(MyUserControl));

    public Point<object> MyPoint
    {
        get { return (Point<???>) GetValue(PointDependencyProperty ); }
        set { SetValue(PointDependencyProperty, value); }
    }
}

从上面的代码可以看出,我不知道如何注册这个属性。甚至可以做到吗?我试过object,但这是可以为空的,所以编译器告诉我:

The type 'object' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'MyNamespace.Point<T>'

使MyUserControl泛型会因各种原因而成为一个问题,因此我也不想沿着这条路走下去。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

这个应该为你做。如果你因为打字不好而无法做某事,那么考虑包含你不能做的事情,在这个例子中,MYPOINT包含不同类型的对象,而DP并不关心。

public partial class MyUserControl : UserControl
{
    public MyUserControl()
    {
        InitializeComponent();
        var mp = new MyPoint();
        var mv = new MyType<string>("Now is the time");
        mp.MyType = mv;
        MyPoint = mp;
    }

    public static readonly DependencyProperty PointDependencyProperty =
        DependencyProperty.Register(
          "MyPoint",
          typeof(MyPoint),  // This is the problem!
          typeof(MyUserControl));

    public MyPoint MyPoint
    {
        get { return (MyPoint)GetValue(PointDependencyProperty); }
        set { SetValue(PointDependencyProperty, value); }
    }
}

public class MyPoint
{
    public dynamic MyType { get; set; }
}

public class MyType<T>
{
    public dynamic Myvalue { get; set; }

    public Point MyPoint { get; set; }

    public MyType(T value)
    {
        Myvalue = value;
    }
}

答案 1 :(得分:0)

这是因为您将T定义为struct或导出该内容的内容。

如果您将Point<object>替换为struct,例如Point<DateTime>就可以了:

public Point<DateTime> MyPoint
{
    get { return (Point<DateTime>) GetValue(PointDependencyProperty ); }
    set { SetValue(PointDependencyProperty, value); }
}

我想知道,你真的需要T成为struct吗?您无法将Point<T>定义为:

class Point<T>
{
}

这意味着T可以是任何内容,您可以按照以前的方式访问它,而不会仅使用objectdynamic