Ответ 1
приведенный ниже код отлично работает с преобразованием в Guid. проверьте его
id = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(text);
У меня есть общий метод, который преобразует идентификатор из строки (например, извлекается из значения 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
Не слишком уверен, как обойти это. Любые предложения?
приведенный ниже код отлично работает с преобразованием в Guid. проверьте его
id = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(text);
Если T
будет либо Guid
, либо Int32
, то это не очень общий, не так ли? Просто напишите два метода - либо с разными именами, либо, возможно, с перегрузками. Я не вижу преимуществ в использовании дженериков здесь, и это вполне может сделать ваш код более сложным, чем это должно быть.
Вы можете попробовать что-то вроде этого:
private void MyMethod<T>(string rawId, Action<T> doSomethingWithId)
{
T id = (T)Activator.CreateInstance(typeof(T), new object[] { rawId });
doSomethingWithId(id);
}