Как преобразовать объект в универсальный класс с Типом T - PullRequest
0 голосов
/ 01 июля 2019

Я хочу преобразовать объект типа объекта в общий класс с типом 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 голосов
/ 01 июля 2019

Вы неправильно поняли, как работают дженерики в C #.Когда вы пишете Foo<T> в своем коде, когда он компилируется, компилятор узнает во время компиляции , какой тип T на самом деле.Это не то, что он выяснит во время выполнения (кроме случаев, когда вы пишете Foo<dynamic>, но это не решит вашу проблему).

Если вы понимаете этот базовый факт, то легко понять, что естьневозможный способ приведения объекта времени выполнения с неизвестным типом во время компиляции к открытому универсальному типу Foo<T>;как ты мог?Компилятор должен знать T когда он компилируется!Вы можете попробовать привести его только к закрытым универсальным типам, то есть к типам, где T равно известно .Затем приведение будет успешным или неуспешным во время выполнения в зависимости от того, какой T вы на самом деле выберете.

...