Welcome to mirror list, hosted at ThFree Co, Russian Federation.

Resource.cs « Xamarin.PropertyEditing - github.com/xamarin/Xamarin.PropertyEditing.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 24cc959b1734417140ad43daf89797d18619c05d (plain)
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);
		}
	}
}