我有一个泛型类,它采用模板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
泛型会因各种原因而成为一个问题,因此我也不想沿着这条路走下去。有没有办法做到这一点?
答案 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
可以是任何内容,您可以按照以前的方式访问它,而不会仅使用object
或dynamic
。