将类转换为另一个类或将类转换为另一个类

Kha*_*mar 33 c# casting class type-conversion

我的问题显示在此代码中

我有这样的课

public class  maincs
{
  public int a;
  public int b;
  public int c;
  public int d; 
}

public class  sub1
{
  public int a;
  public int b;
  public int c;
}


public void methoda (sub1 model)
{
  maincs mdata = new maincs(){a = model.a , b = model.b , c= model.c} ;   

  // is there is a way to directly cast class sub1 into main like that    
  mdata = (maincs) model;    
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*ram 53

您已经定义了转换,如果您希望能够进行转换,您只需要更进一步.例如:

public class sub1
{
    public int a;
    public int b;
    public int c;

    public static explicit operator maincs(sub1 obj)
    {
        maincs output = new maincs() { a = obj.a, b = obj.b, c = obj.c };
        return output;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,它允许你做类似的事情

static void Main()
{
    sub1 mySub = new sub1();
    maincs myMain = (maincs)mySub;
}
Run Code Online (Sandbox Code Playgroud)

  • 甚至比选定的答案更好 (3认同)
  • 使用您的代码使用确切的 props 从一个类转换/转换到另一个类是否有任何影响? (2认同)

Tyl*_*ong 39

使用JSON序列化和反序列化:

using Newtonsoft.Json;

Class1 obj1 = new Class1();
Class2 obj2 = JsonConvert.DeserializeObject<Class2>(JsonConvert.SerializeObject(obj1));
Run Code Online (Sandbox Code Playgroud)

要么:

public class Class1
{
    public static explicit operator Class2(Class1 obj)
    {
        return JsonConvert.DeserializeObject<Class2>(JsonConvert.SerializeObject(obj));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,它允许你做类似的事情

static void Main()
{
    Class1 obj1 = new Class1();
    Class2 obj2 = (Class2)obj1;
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,使用Newtonsoft json序列化器非常简单且高效。有.Net序列化程序,但我发现Newtonsoft优于.Net json序列化程序。我发现此链接提供了简短的比较http://www.newtonsoft.com/json/help/html/JsonNetVsDotNetSerializers.htm (2认同)
  • 这似乎是最新的,并且最适合我的需求。赞! (2认同)

Sta*_*ker 34

他想说的是:

"如果你有两个共享大多数相同属性的类,你可以将一个对象从一个类转换a为一个类,b并自动使系统通过共享属性名来理解赋值?"

选项1:使用反射

缺点:它会比你想象的更慢.

选项2:使一个类派生自另一个,第一个具有共同属性,另一个具有共同属性.

缺点:加上!如果您在应用程序中为两层执行此操作,则两个层将耦合!

让我们:

class customer
{
    public string firstname { get; set; }
    public string lastname { get; set; }
    public int age { get; set; }
}
class employee
{
    public string firstname { get; set; }
    public int age { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

现在这里是Object类型的扩展:

public static T Cast<T>(this Object myobj)
{
    Type objectType = myobj.GetType();
    Type target = typeof(T);
    var x = Activator.CreateInstance(target, false);
    var z = from source in objectType.GetMembers().ToList()
        where source.MemberType == MemberTypes.Property select source ;
    var d = from source in target.GetMembers().ToList()
        where source.MemberType == MemberTypes.Property select source;
    List<MemberInfo> members = d.Where(memberInfo => d.Select(c => c.Name)
       .ToList().Contains(memberInfo.Name)).ToList();
    PropertyInfo propertyInfo;
    object value;
    foreach (var memberInfo in members)
    {
        propertyInfo = typeof(T).GetProperty(memberInfo.Name);
        value = myobj.GetType().GetProperty(memberInfo.Name).GetValue(myobj,null);

        propertyInfo.SetValue(x,value,null);
    }   
    return (T)x;
}  
Run Code Online (Sandbox Code Playgroud)

现在你像这样使用它:

static void Main(string[] args)
{
    var cus = new customer();
    cus.firstname = "John";
    cus.age = 3;
    employee emp =  cus.Cast<employee>();
}
Run Code Online (Sandbox Code Playgroud)

方法转换检查两个对象之间的公共属性并自动执行赋值.

  • 我猜你错过了使用 'z' 变量。它应该在初始化“成员”变量时使用,即 List&lt;MemberInfo&gt; members = z.Where(memberInfo =&gt; d.Select(c =&gt; c.Name) .ToList().Contains(memberInfo.Name)).ToList( ); (3认同)
  • 扩展方法Cast将导致与System.Linq Enumerable.Cast <TResult>冲突,并可能导致难以调试的错误.建议更改名称. (2认同)

Jak*_*son 5

您可以将类结构更改为:

public class maincs : sub1
{
   public int d; 
}

public class sub1
{
   public int a;
   public int b;
   public int c;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以保留一个sub1列表并将其中一些转换为mainc.