C#如何将一个只有各种公共属性的类转换成结构体struct?

爱在今世 2014-07-03 03:04:25
RT,假设有N个类。每个类的结构都类似于如下
public class a
{
public string a{get;set;}
public int b{get;set;}
.......
public float c{get;set;}
}


如何将这个类转换成

public struct a
{
public string a;
public int b;
.......
public float c;
}


以上转换需要在程序运行的过程中转换。求各位指点迷津啊!
...全文
1085 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
宝_爸 2014-07-03
  • 打赏
  • 举报
回复
引用 13 楼 showyusy 的回复:
[quote=引用 10 楼 findcaiyzh 的回复:] 奇怪我这里DataContractJsonSerializer 也可以啊,实体类和上面的一样

            using (MemoryStream stream1 = new MemoryStream())
            {
                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(ClassOuter));

                ser.WriteObject(stream1, outer);

                stream1.Position = 0;
                using (StreamReader sr = new StreamReader(stream1))
                {
                    string result1 = sr.ReadToEnd();
                }
                
            }

结果也是 {"classA":{"a":"aaa","b":10,"c":9.99},"d":20}
引用 11 楼 findcaiyzh 的回复:
改成 public class ClassOuter { public object classA { get; set; } public int d { get; set; } } 后,Json.net版本(8楼的)没有问题,你可以试一下。
我把代码和报错都放上来了

public class asc
    {
        public int i{get;set;}
        public string s{get;set;}
    }
    public class pub
    {
        public string command
        {
            get;
            set;
        }
        public object obj
        {
            get;
            set;
        }
        public string conditions
        {
            get;
            set;
        }
    }
public static void test8()
        {
            asc ac = new asc();
            ac.i = 5;
            ac.s = "实验";
            pub p = new pub();
            p.command = "shiyan";
            p.obj = ac;
            p.conditions = "试验";
            DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(pub));
            MemoryStream ms = new MemoryStream();
            js.WriteObject(ms, p);
            System.Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
            
            
        }
[/quote] 如果你必须用object类型的话,用Json.net吧。
showjim 2014-07-03
  • 打赏
  • 举报
回复
fastCSharp
            asc ac = new asc();
            ac.i = 5;
            ac.s = "实验";
            pub p = new pub();
            p.command = "shiyan";
            p.obj = ac;
            p.conditions = "试验";
            Console.WriteLine(fastCSharp.setup.cSharp.json.toJson.Get(p));
bwangel 2014-07-03
  • 打赏
  • 举报
回复 1
Newtonsoft可以序列化任意类型到json.不管他是类还是结构体。甚至是匿名类型,不管其中是属性还是字段。不管是数组还是序列。 LZ这种问题,建议直接报需求。而不要自己假定一个解方案,再去问这个方案怎么实现。 比如说,你女朋友问你要天上的月亮,你跑来问怎样才能造飞船,而事实上只要一盆水就够了。
老张一笑 2014-07-03
  • 打赏
  • 举报
回复

 static void Main(string[] args)
        {
            IObj a = new A();
            a.Name = "张三";
            IObj b = new B();
            b = a;
            
            Console.WriteLine(b.Name);
            Console.WriteLine(a.Name);
            Console.ReadKey();
        }

 interface IObj
    {
        string Name { set; get; }
    }

    struct A : IObj
    {   
        public string Name
        {
            set;
            get;
        }
    }
    class B : IObj
    {
        public string Name
        {
            get;
            set;
        }
    }


小疯疯008 2014-07-03
  • 打赏
  • 举报
回复

Newtonsoft.Json.JsonConvert.SerializeObject(data) //直接用这个类就可以转换为json对象了
爱在今世 2014-07-03
  • 打赏
  • 举报
回复
引用 10 楼 findcaiyzh 的回复:
奇怪我这里DataContractJsonSerializer 也可以啊,实体类和上面的一样



using (MemoryStream stream1 = new MemoryStream())
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(ClassOuter));

ser.WriteObject(stream1, outer);

stream1.Position = 0;
using (StreamReader sr = new StreamReader(stream1))
{
string result1 = sr.ReadToEnd();
}

}



结果也是
{"classA":{"a":"aaa","b":10,"c":9.99},"d":20}


引用 11 楼 findcaiyzh 的回复:
改成
public class ClassOuter
{
public object classA { get; set; }
public int d { get; set; }
}

后,Json.net版本(8楼的)没有问题,你可以试一下。


我把代码和报错都放上来了

public class asc
{
public int i{get;set;}
public string s{get;set;}
}
public class pub
{
public string command
{
get;
set;
}
public object obj
{
get;
set;
}
public string conditions
{
get;
set;
}
}
public static void test8()
{
asc ac = new asc();
ac.i = 5;
ac.s = "实验";
pub p = new pub();
p.command = "shiyan";
p.obj = ac;
p.conditions = "试验";
DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(pub));
MemoryStream ms = new MemoryStream();
js.WriteObject(ms, p);
System.Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));


}
宝_爸 2014-07-03
  • 打赏
  • 举报
回复
如果用DataContractJsonSerializer , 你不能用object,但是可以试一试用一个基类 [DataContract] public class Person : BaseObject { [DataMember] public string Age { get; set; } [DataMember] public string Name { get; set; } } [DataContract] [KnownType(typeof(Person))] public class BaseObject { } 这样就可以在实体类中使用BaseObject的属性了,我在xml serializer中用过。 参考: http://stackoverflow.com/questions/9659002/datacontract-serialization-can-i-serialize-a-type-property
宝_爸 2014-07-03
  • 打赏
  • 举报
回复
改成 public class ClassOuter { public object classA { get; set; } public int d { get; set; } } 后,Json.net版本(8楼的)没有问题,你可以试一下。
宝_爸 2014-07-03
  • 打赏
  • 举报
回复
奇怪我这里DataContractJsonSerializer 也可以啊,实体类和上面的一样

            using (MemoryStream stream1 = new MemoryStream())
            {
                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(ClassOuter));

                ser.WriteObject(stream1, outer);

                stream1.Position = 0;
                using (StreamReader sr = new StreamReader(stream1))
                {
                    string result1 = sr.ReadToEnd();
                }
                
            }

结果也是 {"classA":{"a":"aaa","b":10,"c":9.99},"d":20}
爱在今世 2014-07-03
  • 打赏
  • 举报
回复
引用 6 楼 wanghui0380 的回复:
这个没有直接的办法,一般借助automapper,emitmapper去自动映射(属性名一样可以自动映射,属性不一样需要创建映射规则) ps:你为啥要赚结构体呢,转json class可以直接转啊,net4有现成的类,当然你可以可以用一个比较优秀的第三方类Newtonsoft.Json完成(个人建议这个,这类写的还是停优秀滴,起码正常起码可以直接用,不用担心循环引用问题) 至于加密这个事情,你自己干,俺们不说啥了
引用 7 楼 findcaiyzh 的回复:
类定义

    public class ClassA
    {
        public string a{get;set;}
        public int b{get;set;}

        public float c{get;set;}
    }
调用

 ClassA a = new ClassA()
                {
                    a = "aaa",
                    b = 10,
                    c = 9.99f
                };

            string result = JsonConvert.SerializeObject(a);
结果: {"a":"aaa","b":10,"c":9.99} 用的Json.Net( http://james.newtonking.com/json)
是这样的

public class pub
{
//命令,用于指示对方程序该做什么
public string a{get;set;}
//数据,为一个类的实例
public object b{get;set;}
}
我是要发送这样的数据,但是JsonConvert.SerializeObject(pub)这样的话,会在public object b{get;set;}这里报错
宝_爸 2014-07-03
  • 打赏
  • 举报
回复
嵌套也没有问题啊 实体类

   public class ClassOuter
    {
        public ClassA classA { get; set; }
        public int d { get; set; }
    }

    public class ClassA
    {
        public string a{get;set;}
        public int b{get;set;}

        public float c{get;set;}
    }
调用:

            ClassOuter outer = new ClassOuter()
                {
                    classA = new ClassA()
                        {
                            a = "aaa",
                            b = 10,
                            c = 9.99f
                        },

                    d = 20
                };


            string result = JsonConvert.SerializeObject(outer);
结果 {"classA":{"a":"aaa","b":10,"c":9.99},"d":20}
宝_爸 2014-07-03
  • 打赏
  • 举报
回复
类定义

    public class ClassA
    {
        public string a{get;set;}
        public int b{get;set;}

        public float c{get;set;}
    }
调用

 ClassA a = new ClassA()
                {
                    a = "aaa",
                    b = 10,
                    c = 9.99f
                };

            string result = JsonConvert.SerializeObject(a);
结果: {"a":"aaa","b":10,"c":9.99} 用的Json.Net( http://james.newtonking.com/json)
wanghui0380 2014-07-03
  • 打赏
  • 举报
回复
这个没有直接的办法,一般借助automapper,emitmapper去自动映射(属性名一样可以自动映射,属性不一样需要创建映射规则) ps:你为啥要赚结构体呢,转json class可以直接转啊,net4有现成的类,当然你可以可以用一个比较优秀的第三方类Newtonsoft.Json完成(个人建议这个,这类写的还是停优秀滴,起码正常起码可以直接用,不用担心循环引用问题) 至于加密这个事情,你自己干,俺们不说啥了
爱在今世 2014-07-03
  • 打赏
  • 举报
回复
然而我不知道是不是搞错了,DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(pub))这一招中 pub的成员属性可以是结构体,但是不能是另一个类的实例。所以我只好想把这个另一个类转换成结构体在传进pub类的实例中,然后转换成json。
宝_爸 2014-07-03
  • 打赏
  • 举报
回复
json的serialize h和deserialize不需要结构啊,属性应该也可以吧。
爱在今世 2014-07-03
  • 打赏
  • 举报
回复
是这样的,我需要将一个实例化的这种类转换成json然后加密发个对方,然后由对方解密后得到json在还原成这个类
引用 1 楼 bdmh 的回复:
先说说你为什么这样干,可能有更好的方法解决你的问题
引用 2 楼 findcaiyzh 的回复:
运行中转换?动态编译?
宝_爸 2014-07-03
  • 打赏
  • 举报
回复
运行中转换?动态编译?
bdmh 2014-07-03
  • 打赏
  • 举报
回复
先说说你为什么这样干,可能有更好的方法解决你的问题

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧