C# 如何基于另一个对象创建新对象?
我有一些无用的对象,比如说,有30个属性。其中一半对我有用,所以我想创建一个新的有用对象,只包含我需要的属性,这样其余的就不会占用对象可视化工具中的空间。我不想定义一个新的类并把它们输入。我想要像这样的东西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
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 isnew{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();
}
}