Любой встроенный объект. Тип объекта <T> - PullRequest
4 голосов
/ 20 марта 2012

У меня есть строка ввода, такая как

"x=y|a=b|c=10" etc

, которая преобразуется в динамическую, которую я использую как

dynamic d = getDynamicFromStringAbove();

someFunc( d.a.AsType<int>() )

, где AsType - метод расширения, определенный как

   public static T AsType<T>(this string o){
        return (T) Convert.ChangeType(o, typeof(T));
    }   

ВОПРОС - Есть ли в фреймворке что-нибудь, что обеспечивает это уже

        object.AsType<T>()

??Кажется, это очень удобно с динамическими типами, поэтому я предполагаю, что он есть, и я не хочу добавлять код, который уже существует

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

Нет, нет встроенного метода, который бы работал как ваш метод расширения. Я думаю, что дизайнеры фреймворков хотели, чтобы люди знали, что для анализа строки в int и т. Д. Необходимо выполнить явную операцию

Кстати, могу я предложить изменить ваш AsType метод, чтобы использовать TypeConverter вместо Convert.ChangeType? Это немного более мощный и гибкий. Например, он лучше работает для преобразования значений перечисления в соответствующие им типы.

public enum Foo {A,B,C}
...

TypeDescriptor.GetConverter(typeof(Foo)).ConvertFrom("A"); // Yields Foo.A
Convert.ChangeType("A", typeof(Foo));                      // Throws exception

См. этот ответ для получения дополнительной информации.

Обновление

Я должен указать:

  1. Этот подход действительно имеет смысл, только если ваш .AsType() метод принимает object в качестве параметра. В этом вопросе вы принимаете string, и каким образом s.AsType<int>() предпочтительнее int.Parse(s)?
  2. Поскольку вы не можете использовать синтаксис метода расширения для значения dynamic, приведенный в вопросе код на самом деле не будет работать без приведения d.a к строковому значению.
2 голосов
/ 20 марта 2012

Возможно, вы ищете ключевое слово as, хотя оно работает только для типов ссылок.

Вы бы написали выражение вроде:

var instanceOfT = a as T;

Если a можно преобразовать в T, то он будет содержать действительную строго типизированную ссылку этого типа. В противном случае a будет ссылкой null.

Дополнительные примеры того, что вы можете и не можете делать с as ...

dynamic d;

d = "test!";
// this will work and get a valid String reference
var stringInstance = d as String;

d = 1;
// next line generates a compiler error as Int32 (int) isn't a reference type
var integerInstance = d as Int32;
// and this compiles, but results in a null reference as d isn't a String anymore
var anotherString = d as String;
...