Преобразование значения из строкового в общий тип, который является либо Guid, либо int

У меня есть общий метод, который преобразует идентификатор из строки (например, извлекается из значения 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

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

Ответ 1

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

id = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(text);

Ответ 2

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

Ответ 3

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

private void MyMethod<T>(string rawId, Action<T> doSomethingWithId)
{
    T id = (T)Activator.CreateInstance(typeof(T), new object[] { rawId });
    doSomethingWithId(id);
}