我有一个实现Class<T>
的泛型类IEnumerable<T>
。 T
也被限制为实施IConvertable
。
我也希望这个类能够假装成一个类似字符串的对象,所以我想实现IEnumerable<char>
。但是,IEnumerable<T>
和IEnumerable<char>
发生冲突 - 如果T
为char
会发生什么?
有没有人对如何做到这一点有任何建议?
编辑:这里有一些澄清 - 我希望能够做到以下几点:
public IEnumerator<T> GetEnumerator()
{
for (var i = _offset; i < _offset + _length; i++)
yield return _array[i];
}
public IEnumerator<char> GetEnumerator()
{
for (var i = _offset; i < _offset + _length; i++)
yield return _array[i].ToChar(null);
}
答案 0 :(得分:10)
有没有人对如何做到这一点有任何建议?
泛型类型的声明,使得基础类型可以在建设中统一有时是非法的,并且几乎总是一个坏主意。避免,避免,避免。
我的建议:如果你想要一个像字符串一样的对象,那么要么覆盖ToString(),要么声明一个显式(或者,我想,隐式)转换为字符串。如果用户想要一系列字符,那么他们可以从字符串中获取一个字符。
答案 1 :(得分:2)
你说你需要你的班级“假装是一个类似字符串的对象”。你能否使类似字符串的行为更明确,并且完全避免实现IEnumerable<char>
?
public IEnumerator<T> GetEnumerator()
{
for (var i = _offset; i < _offset + _length; i++)
yield return _array[i];
}
// either
public IEnumerator<char> GetCharEnumerator()
{
for (var i = _offset; i < _offset + _length; i++)
yield return _array[i].ToChar(null);
}
// or
public IEnumerable<char> AsCharSequence()
{
for (var i = _offset; i < _offset + _length; i++)
yield return _array[i].ToChar(null);
}
答案 2 :(得分:1)
public class myClass<T>() : IEnuerable<T> where T: IConvertable
{
public override string ToString()
{
if(typeof(T).Equals(typeof(char)))
return this.Select(obj => obj.ToChar(null).ToString()).Aggregate((cur, nex) => cur + "," + nex);;
else
return this.Select(obj => obj.ToString()).Aggregate((cur, nex) => cur + "," + nex);
}
}
或者你可以使用扩展方法
public static class extension
{
public static string To_String<T>(this IEnumerable<T> data) where T:IConvertable
{
if(typeof(T).Equals(typeof(char)))
return data.Select(obj => obj.ToChar(null).ToString()).Aggregate((cur, nex) => cur + "," + nex);;
else
return data.Select(obj => obj.ToString()).Aggregate((cur, nex) => cur + "," + nex);
}
}
或只是把if
public IEnumerator<T> GetEnumerator()
{
if(typeof(T).Equals(typeof(char)))
for (var i = _offset; i < _offset + _length; i++)
yield return _array[i].ToChar(null);
else
for (var i = _offset; i < _offset + _length; i++)
yield return _array[i];
}