泛型将未知类型转换为另一个类型
本文关键字:另一个 类型 类型转换 未知 泛型 | 更新日期: 2023-09-27 17:50:44
我正在重新表述我的问题,使其更具体,并针对实际关注的领域。
我有许多不同的类,它们是我的实体,我不知道那个类里有什么。当我想要将实体升级到新的实体时,我想要将属性转移到新的实体,这些实体被称为相同的(并且正如我发现的那样,它们是不区分大小写的)。
我的问题很简单,但可能需要一个复杂的答案。
当我遇到与升级后的类型不同的类型时,我需要将旧类型转换为新类型。这两种类型都是未知的,因为这是关键。我可以传递任意两个我想要的类,它会很好地传递属性。
如果我有两个类:
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而不是一个Parse,使它更安全,但你得到的要点。我知道这并不优雅,但如果有人能告诉我如何正确地将未知对象转换为其他未知对象,那就太好了。
泛型系统有时需要一些帮助来了解泛型的类型。这是通过类型约束(ref)来处理的,它可能对您的示例有所帮助。
如果你知道你想要转换的泛型类型总是一些基类,使用where T:<base class name>
约束。
如果强制转换异常是由于它不能识别非继承类型之间的隐式强制转换,那么反射可能是您唯一的选择。
使用泛型约束new
public static void SetEntityValue<TEntity>(ref TEntity entityToTransform, PropertyHelper entityProperty) where TEntity: new
允许你做:
TEntity ent = new TEntity()
OR(我认为这是你想要的)
使用相同的东西(泛型约束),您可以告诉方法泛型参数类型是什么/派生自什么。
public static void SetEntityValue<TEntity>(ref TEntity entityToTransform, PropertyHelper entityProperty) where TEntity: x
这基本上意味着你可以告诉编译器泛型类型必须是什么(这意味着你在方法中的强制类型转换是有意义的,编译
如果你不知道类型是什么,那么你可能会在对象上使用反射…