正在创建通用DependencyProperty

本文关键字:DependencyProperty 创建 | 更新日期: 2023-09-27 18:26:33

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

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

由于我不想在这里讨论的原因,我真的需要Tstruct,而不是任何对象或类。

我想创建一个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,但这是可以为null的,所以编译器告诉我:

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通用化将成为一个问题,所以我也不想走这条路。有办法做到这一点吗?

正在创建通用DependencyProperty

这个应该为您完成。当你因为强类型而不能做某事时,考虑包含你不能做的事情,在这个例子中,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;
    }
}

这是因为您将T定义为struct或其派生对象。

如果用struct替换Point<object>,就像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的缺点。

相关文章:
  • 没有找到相关文章