forked from ThatRendle/Simple.Data
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathXElementExtensions.cs
More file actions
71 lines (65 loc) · 2.67 KB
/
XElementExtensions.cs
File metadata and controls
71 lines (65 loc) · 2.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using Simple.Data.Extensions;
namespace Simple.Data.Mocking
{
static class XElementExtensions
{
public static XAttribute TryGetAttribute(this XElement element, XName attributeName)
{
var attribute = element.Attribute(attributeName) ??
element.Attributes().SingleOrDefault(
a => a.Name.ToString().Homogenize() == attributeName.ToString().Homogenize());
return attribute ?? new XAttribute(attributeName, string.Empty);
}
public static string TryGetAttributeValue(this XElement element, XName attributeName)
{
var attribute = element.Attribute(attributeName) ??
element.Attributes().SingleOrDefault(
a => a.Name.ToString().Homogenize() == attributeName.ToString().Homogenize());
return attribute == null ? null : attribute.Value;
}
public static IDictionary<string, object> AttributesToDictionary(this XElement element)
{
return element.Attributes().ToDictionary(a => a.Name.ToString(), a => ConvertValue(a,element.Parent));
}
public static object ConvertValue(this XAttribute attribute, XElement tableElement)
{
var typeName = tableElement.Attribute(attribute.Name);
if (typeName != null)
{
var type = Type.GetType(typeName.Value);
if (type != null)
{
return ConvertValue(attribute.Value, type);
}
}
return attribute.Value;
}
public static object ConvertValue(this XAttribute attribute)
{
if (attribute.Parent == null || attribute.Parent.Parent == null) return string.Empty;
var typeName = attribute.Parent.Parent.Attribute(attribute.Name);
if (typeName != null)
{
var type = Type.GetType(typeName.Value);
if (type != null)
{
return ConvertValue(attribute.Value, type);
}
}
return attribute.Value;
}
private static object ConvertValue(string value, Type type)
{
var parseMethod = type.GetMethod("Parse", new[] {typeof (string)});
if (parseMethod != null)
{
return parseMethod.Invoke(null, new[] {value});
}
return Convert.ChangeType(value, type);
}
}
}