class 中的通用 属性
Generic property in class
我有一个class,它有2个属性键和值,键将始终用作字符串类型,但是value
属性的值需要是泛型的。
所以我想为 属性 而不是 class 创建一个泛型类型,因为如果我为 class 创建一个泛型,我用于 class 的类型将用于所有 属性 的通用列表 class 中的所有项目。
任何人都可以告诉我我怎样才能做到这一点。下面是 class:
public class KeyValuePairs
{
public string Key { get; set; }
public object Value { get; set; }
}
简短的回答是:
public class KeyValuePairs<TValue>
{
public string Key { get; set; }
public TValue Value { get; set; }
}
长一点的是:为什么不将 System.Collections.Generic.KeyValuePair<TKey,TValue>
结构与 string
一起用于 TKey
以及任何对 TValue
有用的东西?
您的通用示例 class:
var key = new KeyValuePairs<int>{ Key = "abc", Value = 123 };
我会让键不可变,因为一旦对象被添加到依赖于键的集合中,更改它不是一个好主意:
public class KeyValuePairs<TValue>
{
public KeyValuePairs(string key, TValue value)
{
_key = key;
Value = value;
}
private readonly string _key;
public string Key { get { return _key; } }
public TValue Value { get; set; }
}
示例:
var key = new KeyValuePairs<int>("abc", 123);
如果您不知道如何操作,我建议您在继续之前进一步阅读泛型(开始 here)。为了启发您,可以使用以下代码实现。
public class KeyValuePairs<T>
{
public string Key { get; set; }
public T Value { get; set; }
}
但是,System.Collections.Generic
命名空间中已经存在这样的 class。 KeyValuePair.
你不能完全那样做,这是行不通的。
假设您可以编写以下内容:
public class KeyValuePairs
{
public string Key { get; set; }
public T Value<T> { get; set; }
}
以下代码中 foo
变量的类型是什么?
var pair = new KeyValuePairs();
var foo = pair.Value;
好的,现在让我们假设语言允许你这样做:
var pair = new KeyValuePairs();
var foo = pair.Value<int>;
嗯...以下代码的行为如何?
var pair = new KeyValuePairs();
pair.Value = new Thread();
var foo = pair.Value<int>;
如您所见,语言不允许这样做是有充分理由的。
当然你也可以按照下面的方式来做:
public class KeyValuePairs<TValue>
{
public string Key { get; set; }
public TValue Value { get; set; }
}
(或只使用 System.Collections.Generic.KeyValuePair<string, TValue>
)
或者您可以将 属性 替换为方法对:
// Warning: bad code!
public class KeyValuePairs<TValue>
{
private object _value;
public string Key { get; set; }
public TValue GetValue<TValue>()
{
return _value;
}
public void SetValue<TValue>(TValue value)
{
_value = value;
}
}
但是如果您考虑这样做,显然 存在设计问题,因为与 相比 object
-打字属性.
这是一个使用 KeyValuePair<string, object>
的解决方案:
var list = new List<KeyValuePair<string, object>>();
list.Add(new KeyValuePair<string, object>("string", "Hello, World!"));
list.Add(new KeyValuePair<string, object>("int", 42));
list.Add(new KeyValuePair<string, object>("bool", true));
foreach (var item in list)
Console.WriteLine("[{0}] = {1}", item.Key, item.Value);
这里是 demo。
我有一个class,它有2个属性键和值,键将始终用作字符串类型,但是value
属性的值需要是泛型的。
所以我想为 属性 而不是 class 创建一个泛型类型,因为如果我为 class 创建一个泛型,我用于 class 的类型将用于所有 属性 的通用列表 class 中的所有项目。
任何人都可以告诉我我怎样才能做到这一点。下面是 class:
public class KeyValuePairs
{
public string Key { get; set; }
public object Value { get; set; }
}
简短的回答是:
public class KeyValuePairs<TValue>
{
public string Key { get; set; }
public TValue Value { get; set; }
}
长一点的是:为什么不将 System.Collections.Generic.KeyValuePair<TKey,TValue>
结构与 string
一起用于 TKey
以及任何对 TValue
有用的东西?
您的通用示例 class:
var key = new KeyValuePairs<int>{ Key = "abc", Value = 123 };
我会让键不可变,因为一旦对象被添加到依赖于键的集合中,更改它不是一个好主意:
public class KeyValuePairs<TValue>
{
public KeyValuePairs(string key, TValue value)
{
_key = key;
Value = value;
}
private readonly string _key;
public string Key { get { return _key; } }
public TValue Value { get; set; }
}
示例:
var key = new KeyValuePairs<int>("abc", 123);
如果您不知道如何操作,我建议您在继续之前进一步阅读泛型(开始 here)。为了启发您,可以使用以下代码实现。
public class KeyValuePairs<T>
{
public string Key { get; set; }
public T Value { get; set; }
}
但是,System.Collections.Generic
命名空间中已经存在这样的 class。 KeyValuePair.
你不能完全那样做,这是行不通的。
假设您可以编写以下内容:
public class KeyValuePairs
{
public string Key { get; set; }
public T Value<T> { get; set; }
}
以下代码中 foo
变量的类型是什么?
var pair = new KeyValuePairs();
var foo = pair.Value;
好的,现在让我们假设语言允许你这样做:
var pair = new KeyValuePairs();
var foo = pair.Value<int>;
嗯...以下代码的行为如何?
var pair = new KeyValuePairs();
pair.Value = new Thread();
var foo = pair.Value<int>;
如您所见,语言不允许这样做是有充分理由的。
当然你也可以按照下面的方式来做:
public class KeyValuePairs<TValue>
{
public string Key { get; set; }
public TValue Value { get; set; }
}
(或只使用 System.Collections.Generic.KeyValuePair<string, TValue>
)
或者您可以将 属性 替换为方法对:
// Warning: bad code!
public class KeyValuePairs<TValue>
{
private object _value;
public string Key { get; set; }
public TValue GetValue<TValue>()
{
return _value;
}
public void SetValue<TValue>(TValue value)
{
_value = value;
}
}
但是如果您考虑这样做,显然 存在设计问题,因为与 相比 object
-打字属性.
这是一个使用 KeyValuePair<string, object>
的解决方案:
var list = new List<KeyValuePair<string, object>>();
list.Add(new KeyValuePair<string, object>("string", "Hello, World!"));
list.Add(new KeyValuePair<string, object>("int", 42));
list.Add(new KeyValuePair<string, object>("bool", true));
foreach (var item in list)
Console.WriteLine("[{0}] = {1}", item.Key, item.Value);
这里是 demo。