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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
using System;
namespace Xamarin.PropertyEditing
{
public class Resource<T>
: Resource
{
public Resource (ResourceSource source, string name, T value)
: base (source, name)
{
Value = value;
}
public T Value
{
get;
}
public override Type RepresentationType => typeof(T);
}
public class Resource
: IEquatable<Resource>
{
public Resource (string name)
{
if (name == null)
throw new ArgumentNullException (nameof (name));
Name = name;
}
public Resource (ResourceSource source, string name)
: this (name)
{
if (source == null)
throw new ArgumentNullException (nameof (source));
Source = source;
}
/// <summary>
/// Gets the source for this resource.
/// </summary>
/// <remarks>This may be <c>null</c> when the resource is a dynamic reference that is unlocatable.</remarks>
public ResourceSource Source
{
get;
}
/// <remarks>This may be <c>null</c> when the resource is a dynamic reference that is unlocatable.</remarks>
public virtual Type RepresentationType => null;
public string Name
{
get;
}
public override bool Equals (object other)
{
// This does mean that a Resource<T> will match a Resource as long as its source and name are
// the same, but for all intents and purposes this is correct. The identification of resources
// is its source and name, the value is simply a helper for previews.
var r = other as Resource;
if (ReferenceEquals (null, r))
return false;
if (ReferenceEquals (this, other))
return true;
return r.Source == Source && r.Name == Name;
}
public bool Equals (Resource other)
{
return Equals ((object)other);
}
public override int GetHashCode ()
{
unchecked {
int hashCode = Source?.GetHashCode() ?? 0;
hashCode = (hashCode * 397) ^ Name.GetHashCode();
return hashCode;
}
}
public static bool operator == (Resource left, Resource right)
{
return Equals (left, right);
}
public static bool operator != (Resource left, Resource right)
{
return !Equals (left, right);
}
}
}
|