使用C#4.0。我想将MyBuffer<int>
的实例转换为MyBuffer<float>
的实例。转换器必须足够通用以处理其他基本类型。将MyClass <SomeType>转换为MyClass <SomeOtherType>
我希望这个(或同等的解决方案)能够正常工作。怎么样?
var b1 = MyBuffer.Create(new int[100]);
var b2 = Convert.ChangeType(b1, typeof(MyBuffer<float>));
var b3 = Convert.ChangeType(b2, typeof(MyBuffer<byte>));
考虑MyBuffer
类:
public class MyBuffer
{
public static MyBuffer<T> Create<T>(T[] buffer)
where T : struct, IComparable, IConvertible
{
return new MyBuffer<T>(buffer);
}
}
public class MyBuffer<T> : IConvertible
where T : struct, IComparable, IConvertible
{
public T[] Buffer
{
get;
set;
}
public MyBuffer()
{
}
public MyBuffer(T[] buffer)
{
Buffer = buffer;
}
public object ToType(Type conversionType, IFormatProvider provider)
{
if (conversionType == GetType())
return this;
// First problem: Determine if the type is MyBuffer<>.
// if (conversionType == typeof(MyBuffer<>))
{
if (conversionType.IsGenericType && conversionType.GetGenericArguments().Length > 0)
{
var bufferType = conversionType.GetGenericArguments()[0];
dynamic newBuffer = Buffer.
Select(s => Convert.ChangeType(s, bufferType))
.ToArray();
// Second problem: Our dynamic variable will produce an exception here.
return MyBuffer.Create(newBuffer);
}
}
throw new InvalidCastException();
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//
// For completeness...
//
public TypeCode GetTypeCode()
{
throw new NotImplementedException();
}
public bool ToBoolean(IFormatProvider provider)
{
throw new NotImplementedException();
}
public byte ToByte(IFormatProvider provider)
{
throw new NotImplementedException();
}
public char ToChar(IFormatProvider provider)
{
throw new NotImplementedException();
}
public DateTime ToDateTime(IFormatProvider provider)
{
throw new NotImplementedException();
}
public decimal ToDecimal(IFormatProvider provider)
{
throw new NotImplementedException();
}
public double ToDouble(IFormatProvider provider)
{
throw new NotImplementedException();
}
public short ToInt16(IFormatProvider provider)
{
throw new NotImplementedException();
}
public int ToInt32(IFormatProvider provider)
{
throw new NotImplementedException();
}
public long ToInt64(IFormatProvider provider)
{
throw new NotImplementedException();
}
public sbyte ToSByte(IFormatProvider provider)
{
throw new NotImplementedException();
}
public float ToSingle(IFormatProvider provider)
{
throw new NotImplementedException();
}
public string ToString(IFormatProvider provider)
{
throw new NotImplementedException();
}
public ushort ToUInt16(IFormatProvider provider)
{
throw new NotImplementedException();
}
public uint ToUInt32(IFormatProvider provider)
{
throw new NotImplementedException();
}
public ulong ToUInt64(IFormatProvider provider)
{
throw new NotImplementedException();
}
}
在我上面的代码有一些需要解决两个主要问题:
- 如何确定是否
Type
变量等于SomeType<T>
的任意值为T
? - 是否可以调用模板函数
T
设置为Type
变量?
是的,但我想解决一个更普遍的问题。给定一个“SomeClass”的实例,你如何将它转换为同一类,但是具有不同类型的“T”? –
l33t
2013-05-02 12:37:03
@ l33t由于可能的转换是有限的,您希望如何解决这两种类型的问题? – 2013-05-02 12:43:05
任何基本类型; 'byte','int','short','float','double'和它们的有符号/无符号对应。也许也是'布尔'。 – l33t 2013-05-02 12:45:24