你能在c#中自动生成分配对象属性的代码吗?(Visual Studio)

本文关键字:代码 Visual Studio 属性 自动生成 对象 分配 | 更新日期: 2023-09-27 18:13:15

示例:我正在使用一个API,该API具有具有许多属性的各种对象的定义。

这个对象大约有40个属性,我想设置它们。

是否有一种方法可以从对象自动生成以下代码?

contact.AddressId = null;
contact.Anniversary = null;
contact.AssistantId = null;
contact.BirthDay = null;
contact.Children = null;
contact.CompanyAddressInfo = null;
contact.CompanyIdentifier = null;
contact.DisablePortalLogin = null;
contact.Email = null;
contact.Emails = null;
contact.ExtensionData = null;
contact.Fax = null;
contact.Faxes = null;
contact.FaxExt = null;
contact.FirstName = null;
contact.Gender = null;
contact.Id = null;
contact.Inactive = null;
contact.LastName = null;
contact.LastUpdated = null;
contact.ManagerId = null;
contact.Married = null;
contact.NickName = null;
contact.PersonalAddress = null;
contact.PersonalAddressFlag = null;
contact.Phone = null;
contact.PhoneExt = null;
contact.Phones = null;
contact.PortalPassword = null;
contact.PortalSecurityLevel = null;
contact.Relationship = null;
contact.School = null;
contact.SID = null;
contact.SignificantOther = null;
contact.SiteName = null;
contact.Title = null;
contact.Type = null;
contact.UnsubscribeFlag = null;
contact.UpdatedBy = null;

目的是为了可视化,让我看到我在代码中设置了什么,没有设置什么。

你能在c#中自动生成分配对象属性的代码吗?(Visual Studio)

试试这个

    static void Main(string[] args)
    {
        Contact obj = new Contact();
        var props = obj.GetType().GetProperties();
        foreach (var p in props)
            Console.WriteLine("contact.{0}= null;", p.Name);
        Thread.Sleep(1000);
    }

然后复制粘贴控制台屏幕或将其写入文件

它已经有几年的历史了,但是我在偶然发现它之后发布了这个,目前有一个解决方案。如果你正在使用ReSharper,你可以使用对象的初始化器。

var contact = new Contact()
{
};

在初始化器的括号内,你会得到Resharper的"灯泡"。点击它,你可以选择"初始化成员"。你会让所有属性初始化为它们类型的默认值你可以从那里继续,改变那些你想要的。如果初始化器不适合您的需要,您甚至可以选择所有这些并将它们提取到简单的赋值语句中

创建一个Visual Studio代码片段,替换为:

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippet Format="1.0.0"
    xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <Header>
    </Header>
    <Snippet>
        <Declarations>
            <Literal>
                 <ID>AddressId</ID>
                 <ToolTip>Enter Address</ToolTip>
                 <Default>Address</Default>
            </Literal>
            <Literal>
                 <ID>Anniversary</ID>
                 <ToolTip>Enter Anniversary</ToolTip>
                 <Default>Anniversary</Default>
            </Literal>
        </Declarations>
        <Code Language="CSharp">
        <![CDATA[contact.AddressId = $AddressId$;
             contact.Anniversary = $Anniversary$;]]></Code>
    </Snippet>
</CodeSnippet>

不是你真正想要的,但是你可以使用对象初始化器来代替重复的contact.Property1, contact.Property2:

var contact = new Contact
{
    AddressId = foo1,
    Anniversary = foo2,
    AssistantId = foo3,
    BirthDay = foo4,
    Children = foo5,
    CompanyAddressInfo = foo6,
    // ... others fields
}

因此,使用Jonathan的回答,我创建了一个方法,该方法接受一个对象和一个名称,并以null作为占位符吐出所有属性,如问题所示:

    static void Main(string[] args)
    {
        ObjectGenerateNullValues(new Contact(), "contact");
    }
    private static void ObjectGenerateNullValues(object objectType, string objectName)
    {
        var props = objectType.GetType().GetProperties();
        using (StreamWriter sw = new StreamWriter(@"c:'temp'ObjectPropertiesOutput.txt", true))
        {
            foreach (var p in props)
            {
                sw.WriteLine("{0}.{1} = null", objectName, p.Name);
            }
        }
    }

在我继续探索这些api时,我想我应该编写一个轻量级的GUI来为我做这些。