如何使用类型T

时间:2019-07-01 08:26:35

标签: c# wpf generics data-binding casting

我想将类型为object的对象转换为类型T为泛型类。

班级:

public class TestClass<T>
{
    public string Name { get; set; }
    public T SomeValue { get; set; }
}

方法:

public void GetValue(object obj)
{
    var genericParameter = ((System.Windows.Controls.TextBox)obj).DataContext.GetType().GenericTypeArguments[0];
    var castObject = ((System.Windows.Controls.TextBox)obj).DataContext as TestClass<genericParameter>;

    if (castObject != null)
        castObject.Name = "Test";
}

我无法写TestClass<genericParameter>。只有TestClass<int>TestClass<bool>之类的东西有效。

但是我认为检查所有可能性很不好,例如:

public void GetValue(object obj)
{
    var dataContext = ((System.Windows.Controls.TextBox) obj).DataContext;

    if (dataContext is TestClass<int> castObject1)
        castObject1.Name = "Test";

    if (dataContext is TestClass<bool> castObject2)
        castObject2.Name = "Test";

    if (dataContext is TestClass<double> castObject3)
        castObject3.Name = "Test";

    if (dataContext is TestClass<float> castObject4)
        castObject4.Name = "Test";

    if (dataContext is TestClass<string> castObject5)
        castObject5.Name = "Test";
}

有什么方便的方法可以解决我的问题吗?

1 个答案:

答案 0 :(得分:0)

您误解了泛型在C#中的工作方式。当您在代码中编写Foo<T>时,编译器将在编译时知道 T的类型。它不是在运行时会发现的东西(除非您编写Foo<dynamic>,但这不能解决您的问题)。

如果您了解这个基本事实,那么很容易理解,没有办法在编译时将具有未知类型的运行时对象转换为开放的泛型类型Foo<T>;你怎么能?编译器在编译时需要知道T!您只能尝试将其强制转换为封闭的通用类型,即{em>已知T的类型。然后,投射将在运行时成功或失败,具体取决于您实际选择的T