我正在对我的问题进行重新说明,以便更具体并针对实际的关注领域。将未知类型转换为另一个类型的泛型
我有许多不同的类,这是我的实体,我不是那个类的。当我想将实体升级到新实体时,我想将这些属性转换为新的属性(我发现它们不区分大小写)。
我的问题很简单,但可能需要一个复杂的答案。
当我遇到一个不同于升级版本的类型时,我需要将旧版本升级到新版本。这两种类型都是未知的,因为那是重点。我可以通过任何两个我想要的类,它将传递属性很好。
所以,如果我有两类:
public class OldEntity
{
public string Name {get;set;}
public int SomeProperty {get;set;}
}
public class NewEntity
{
public string Name {get;set;}
public string SomeProperty {get;set;}
}
所以,我需要找出旧型的SomeProperty
,然后将其转换为新类型的SomeProperty
。
我想我能做到,我希望有那么这是一种更通用的方法:
switch (typeof(SomeProperty.Value.GetType())
{
case typeof(Int):
return Int.Parse(OldSomeProperty.Value);
}
很显然,这是非常原始的代码,但你得到的要点。
请能有人给我这样做,还有一件事是更宽泛的方式,我有AutoMapper下载,它不注释,这样如果有人能告诉我在哪里,它是怎么做的,这将是一个很好的答案好。
所以我试着简单的解决办法,不是很通用:
public static object ConvertSourceObjectDestinationObject(object source, object destination)
{
// get the string representation of the source object
var strRepresentation = source.ToString();
// find out the destinations type
var originalCode = AssemblyCode(destination.GetType().Assembly.ToString());
// search for a match then convert the source object to the new destination objects type
switch (originalCode)
{
case 0:
return strRepresentation;
case 1:
return int.Parse(strRepresentation);
case 2:
return decimal.Parse(strRepresentation);
case 3:
return DateTime.Parse(strRepresentation);
case 4:
return byte.Parse(strRepresentation);
case 5:
return float.Parse(strRepresentation);
case 6:
return Guid.Parse(strRepresentation);
default:
return strRepresentation;
}
}
public static int AssemblyCode(string assemblyString)
{
if (assemblyString.Equals(typeof(string).Assembly.ToString()))
return 0;
if (assemblyString.Equals(typeof(int).Assembly.ToString()))
return 1;
if (assemblyString.Equals(typeof(decimal).Assembly.ToString()))
return 2;
if (assemblyString.Equals(typeof(DateTime).Assembly.ToString()))
return 3;
if (assemblyString.Equals(typeof(byte).Assembly.ToString()))
return 4;
if (assemblyString.Equals(typeof(float).Assembly.ToString()))
return 5;
if (assemblyString.Equals(typeof(Guid).Assembly.ToString()))
return 6;
return -1;
}
我做了一个新的它做了的TryParse而不是解析,使之更加安全的,但你得到的要点。它不是我所知道的优雅,但是如果有人能够用我的方式将未知物体投射到其他未知物体上,那将会很棒。
我不明白你的问题。 'GetValue'和'SetValue'在'object'上操作,那么为什么你需要投射?如果不是使用带'x'和'y'的抽象例子,而是显示特定的行,导致您的方法出现问题,这可能会有所帮助。 –
该方法出错了。我只传递对象,然后通过关于投射的错误! –
对于光顾的语气我感到抱歉。我检查了你的个人资料,你绝对正确。 –