Преобразовать значение из строки в универсальный тип, который является либо Guid или int - PullRequest
11 голосов
/ 27 октября 2011

У меня есть универсальный метод, который преобразует идентификатор из строки (например, полученный из значения HiddenField в форме ASP.NET) в целевой тип и что-то с ним делает.

private void MyMethod<T>(string rawId, Action<T> doSomethingWithId)
{
    T id = (T)Convert.ChangeType(rawId, typeof(T));
    doSomethingWithId(id);
}

T будет либо Guid, либо Int32, и приведенный выше код падает (во время выполнения), когда это Guid, говоря, что приведение из String к Guid недопустимо.

Тогда я подумал, что могу попробовать проверить тип и, если Guid, создать новый Guid:

var id = default(T);
if (id is Guid)
    id = new Guid(rawId);
else
    id = (T)Convert.ChangeType(rawId, typeof(T));

, теперь это дает ошибку (во время компиляции), что Guid не может быть преобразован ввведите T

Не слишком уверен, как обойти это.Есть предложения?

Ответы [ 3 ]

23 голосов
/ 27 октября 2011

приведенный ниже код отлично работает с преобразованием в Guid.проверить это

id = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(text);
4 голосов
/ 27 октября 2011

Если T будет Guid или Int32, тогда это не на самом деле очень обобщенно, не так ли? Вместо этого просто напишите два метода - либо с разными именами, либо возможно перегрузок. Я не вижу преимущества в использовании дженериков здесь, и это может очень усложнить ваш код, чем он должен быть.

1 голос
/ 27 октября 2011

Вы можете попробовать что-то вроде этого, возможно:

private void MyMethod<T>(string rawId, Action<T> doSomethingWithId)
{
    T id = (T)Activator.CreateInstance(typeof(T), new object[] { rawId });
    doSomethingWithId(id);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...