문자열에서 다음으로 변환
나는 이것을 정말로 얻을 수 있어야한다. 그러나 나는 내가 묻는 것이 더 쉬울 것이라고 생각하는 지점에 불과하다.
C # 함수에서 :
public static T GetValue<T>(String value) where T:new()
{
//Magic happens here
}
마법에 대한 좋은 구현은 무엇입니까? 이것의 배후에있는 아이디어는 내가 파싱 할 xml이 있고 원하는 값이 종종 원시 (bool, int, string 등)이고 이것은 제네릭을 사용하기에 완벽한 장소라는 것입니다 ...하지만 지금은 간단한 해결책이 저를 피하고 있습니다 .
btw, 여기에 구문 분석해야 할 xml 샘플이 있습니다.
<Items>
<item>
<ItemType>PIANO</ItemType>
<Name>A Yamaha piano</Name>
<properties>
<allowUpdates>false</allowUpdates>
<allowCopy>true</allowCopy>
</properties>
</item>
<item>
<ItemType>PIANO_BENCH</ItemType>
<Name>A black piano bench</Name>
<properties>
<allowUpdates>true</allowUpdates>
<allowCopy>false</allowCopy>
<url>www.yamaha.com</url>
</properties>
</item>
<item>
<ItemType>DESK_LAMP</ItemType>
<Name>A Verilux desk lamp</Name>
<properties>
<allowUpdates>true</allowUpdates>
<allowCopy>true</allowCopy>
<quantity>2</quantity>
</properties>
</item>
</Items>
XML을 직접 구문 분석하는 대신 XML에서 클래스로 역 직렬화하는 클래스를 만드는 것이 좋습니다. 나는 것 강하게 bendewey의 대답은 다음과 같은 권장합니다.
그러나 이것을 할 수 없다면 희망이 있습니다. 사용할 수 있습니다 Convert.ChangeType
.
public static T GetValue<T>(String value)
{
return (T)Convert.ChangeType(value, typeof(T));
}
그리고 이렇게 사용하십시오
GetValue<int>("12"); // = 12
GetValue<DateTime>("12/12/98");
대략 다음과 같이 시작할 수 있습니다.
TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
if (converter != null)
{
return (T)converter.ConvertFrom(value);
}
색상이나 문화 문자열 등과 같은 특수 유형의 속성을 구문 분석해야하는 경우 물론 위의 특수 사례를 작성해야합니다. 그러나 이것은 대부분의 기본 유형을 처리합니다.
직렬화 경로를 POCO (Plain old CLR Object)로 이동하기로 결정한 경우 개체를 생성하는 데 도움이되는 도구가 거의 없습니다.
- xsd.exe 를 사용 하여 XML 정의를 기반으로 .cs 파일을 생성 할 수 있습니다.
- WCF REST Starter Kit Preview 2 에는 Paste as Html이라는 새로운 기능이 있습니다 . 이 기능은 정말 멋지고 클립 보드에있는 HTML 블록을 cs 파일에 붙여 넣으면 직렬화를 위해 xml을 CLR 개체로 자동 변환합니다.
For this to work correctly, your generic method is going to have to delegate its actual work to a dedicated class.
Something like
private Dictionary<System.Type, IDeserializer> _Deserializers;
public static T GetValue<T>(String value) where T:new()
{
return _Deserializers[typeof(T)].GetValue(value) as T;
}
where _Deserializers is some kind of dictionary where you register your classes. (obviously, some checking would be required to ensure a deserializer has been registered in the dictionary).
(In that case the where T:new() is useless because your method does not need to create any object.
again with the caveat that doing this is probably a bad idea:
class Item
{
public string ItemType { get; set; }
public string Name { get; set; }
}
public static T GetValue<T>(string xml) where T : new()
{
var omgwtf = Activator.CreateInstance<T>();
var xmlElement = XElement.Parse(xml);
foreach (var child in xmlElement.Descendants())
{
var property = omgwtf.GetType().GetProperty(child.Name.LocalName);
if (property != null)
property.SetValue(omgwtf, child.Value, null);
}
return omgwtf;
}
test run:
static void Main(string[] args)
{
Item piano = GetValue<Item>(@"
<Item>
<ItemType />
<Name>A Yamaha Piano</Name>
<Moose>asdf</Moose>
</Item>");
}
참고URL : https://stackoverflow.com/questions/732677/converting-from-string-to-t
'program tip' 카테고리의 다른 글
Linux (라이브러리 또는 실행 파일)에서 바이너리 파일의 대상 ISA 확장을 결정합니다. (0) | 2020.12.10 |
---|---|
분기 된 터미널에서 xcodebuild 실행 (0) | 2020.12.10 |
jQuery UI 대화 상자 버튼 텍스트를 변수로 (0) | 2020.12.10 |
1 년 전부터 지금까지의 모든 레코드 선택 (0) | 2020.12.10 |
전체 디렉토리 경로없이 파일 이름 만 표시하려면 (0) | 2020.12.10 |