C# 如何基于另一个对象创建新对象?

C# 如何基于另一个对象创建新对象?,c#,object,properties,creation,C#,Object,Properties,Creation,我有一些无用的对象,比如说,有30个属性。其中一半对我有用,所以我想创建一个新的有用对象,只包含我需要的属性,这样其余的就不会占用对象可视化工具中的空间。我不想定义一个新的类并把它们输入。我想要像这样的东西 var list = new List<SomeType> { usefulProp1, usefulProp2, ... }; var usefulObject = new NewItem(notUsefulObject, list); var list=新列表{useful

我有一些无用的对象,比如说,有30个属性。其中一半对我有用,所以我想创建一个新的有用对象,只包含我需要的属性,这样其余的就不会占用对象可视化工具中的空间。我不想定义一个新的类并把它们输入。我想要像这样的东西

var list = new List<SomeType> { usefulProp1, usefulProp2, ... };
var usefulObject = new NewItem(notUsefulObject, list);
var list=新列表{usefulProp1,usefulProp2,…};
var usefulObject=新建项(notUsefulObject,列表);

如果SomeType不是字符串(列表不包含属性名)。

如果它是永久性的,那么正确地执行它将是创建一个从基类继承的类,并只填充所需的属性

public UsefulObject : NotUsefulObject 
{
    public int MyProperty 
    {
       get
       {
          return base.MyProperty; // this is arbitrary you can do it however you want.
       }
       set
       {
          MyProperty = value;
       }
    }
}
然后,您可以使用您的重用工具来重用您想要的有用对象

var list = new List<UsefulObject>();
var list=newlist();
var list=新列表{()=>notUsefulObject.usefulProp1,()=>notUsefulObject.usefulProp2…};
var nm=新的程序集名称(“MyDynamicsSembly”);
TypeBuilder tb=Thread.GetDomain().DefinedDynamicAssembly(nm,AssemblyBuilderAccess.RunAndSave).DefinedDynamicModule(nm.Name,nm.Name+“.dll”).DefineType(“NewItem”,TypeAttributes.Public);
const MethodAttributes GetSetAttributes=MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;
foreach(list.Select中的表达式b(x=>x.Body))
{
MemberInfo mi=((MemberExpression)b).Member;
t型=b型;
FieldBuilder fb=tb.DefineField(mi.Name.ToLower(),t,FieldAttributes.Private);
PropertyBuilder pb=tb.DefineProperty(mi.Name,PropertyAttributes.HasDefault,t,null);
MethodBuilder getBld=tb.DefineMethod(“get_u3;”+mi.Name,GetSetAttr,t,Type.EmptyTypes);
ILGenerator getGen=getBld.GetILGenerator();
getGen.Emit(操作码.Ldarg_0);
getGen.Emit(操作码.Ldfld,fb);
getGen.Emit(操作码.Ret);
MethodBuilder setBld=tb.DefineMethod(“set_u3;”+mi.Name,GetSetAttr,null,new[]{t});
ILGenerator setGen=setBld.GetILGenerator();
setGen.Emit(操作码Ldarg_0);
setGen.Emit(操作码Ldarg_1);
setGen.Emit(操作码.Stfld,fb);
setGen.Emit(操作码Ret);
pb.SetGetMethod(getBld);
pb.设置方法(立根法);
}
object usefulObject=Activator.CreateInstance(tb.CreateType());

因为您说过这个问题是特定于对象可视化工具的,所以最好的解决方案是为类创建一个代理

[DebuggerTypeProxy(typeof(SomeTypeDebugView))]
public class SomeType
{
    public string Foo { get; set; }
    public string Bar { get; set; }

    internal class SomeTypeDebugView
    {
        private SomeType _someType;

        public SomeTypeDebugView(SomeType someType)
        {
            _someType = someType;
        }

        public string Foo { get { return _someType.Foo; } }
    }
}

class Program
{
    static void Main()
    {
        var someType = new SomeType();
        someType.Foo = "foo";
        someType.Bar = "bar";

        Debugger.Break();
    }
}
这将导致默认情况下在调试可视化工具中隐藏
,除非您选择查看“原始类型”

如果您正在寻找一次性调试类型,则可以使用annonamous类型在监视窗口中创建所需的新类型,例如his is
new{Foo=someType.Foo,Bar=someType.Bar}

这也可以与LINQ一起用于对IEnumerable执行选择,例如这里是
someTypeList.select(x=>new{Foo=x.Foo,Bar=x.Bar})


考虑实施设计模式
SomeTypeProxy
将包含一个
SomeType
的实例,仅公开您认为相关的属性和方法。我对您的代码示例感到困惑。我假设您打算拥有
新列表{new SomeType(){usefulProp1=“foo”,usefulProp2=“bar”,notUsefulProp=“漠视”},new SomeType()…}
?如果是这样,您可以使用Linq并创建一个
列表。选择(x=>new{usefulProp1=x.usefulProp1})
可能会有所帮助。我不想重写我感兴趣的所有属性。
[DebuggerTypeProxy(typeof(SomeTypeDebugView))]
public class SomeType
{
    public string Foo { get; set; }
    public string Bar { get; set; }

    internal class SomeTypeDebugView
    {
        private SomeType _someType;

        public SomeTypeDebugView(SomeType someType)
        {
            _someType = someType;
        }

        public string Foo { get { return _someType.Foo; } }
    }
}

class Program
{
    static void Main()
    {
        var someType = new SomeType();
        someType.Foo = "foo";
        someType.Bar = "bar";

        Debugger.Break();
    }
}