如何在C#中操作单值扩展属性以实现MS Graph投票集成?
在C#中操作Microsoft Graph单值扩展属性的实现方案
针对你需要实现投票功能的场景,确实可以用SingleValueLegacyExtendedProperty类来操作单值扩展属性,这个类是Microsoft Graph .NET SDK的原生类,属于Microsoft.Graph.Models命名空间,下面是具体的操作示例:
1. 创建单值扩展属性(以邮件为例)
将投票选项作为扩展属性附加到邮件中,代码示例:
using Microsoft.Graph; using Microsoft.Graph.Models; using Azure.Identity; // 初始化Graph客户端(使用客户端凭证模式,可根据你的认证方式调整) var tenantId = "你的租户ID"; var clientId = "你的应用ID"; var clientSecret = "你的应用密钥"; var graphClient = new GraphServiceClient(new ClientSecretCredential(tenantId, clientId, clientSecret)); // 定义投票选项的单值扩展属性 var votingProperty = new SingleValueLegacyExtendedProperty { // ID格式:String {实体类型GUID} Name 属性名,邮件对应的GUID是{00020329-0000-0000-C000-000000000046} Id = "String {00020329-0000-0000-C000-000000000046} Name VotingOptions", Value = "同意;不同意;待定" }; // 创建带扩展属性的邮件 var voteMessage = new Message { Subject = "项目立项投票", Body = new ItemBody { Content = "请选择你的投票选项", ContentType = BodyType.Text }, SingleValueExtendedProperties = new List<SingleValueLegacyExtendedProperty> { votingProperty }, // 添加收件人信息 ToRecipients = new List<Recipient> { new Recipient { EmailAddress = new EmailAddress { Address = "user@example.com" } } } }; // 发送邮件并保存到已发送 await graphClient.Me.SendMail.PostAsync(new SendMailPostRequestBody { Message = voteMessage, SaveToSentItems = true });
2. 读取邮件中的单值扩展属性
获取邮件时通过Expand包含扩展属性:
// 查询包含投票属性的邮件 var messages = await graphClient.Me.Messages .Request() .Expand("singleValueExtendedProperties($filter=id eq 'String {00020329-0000-0000-C000-000000000046} Name VotingOptions')") .GetAsync(); foreach (var msg in messages) { var votingOptionProp = msg.SingleValueExtendedProperties?.FirstOrDefault(p => p.Id.Contains("VotingOptions")); if (votingOptionProp != null) { Console.WriteLine($"当前投票选项:{votingOptionProp.Value}"); } }
3. 更新单值扩展属性
修改已存在的扩展属性值:
var messageId = "目标邮件的ID"; var targetMessage = await graphClient.Me.Messages[messageId].GetAsync(); // 更新投票选项 var updatedVotingProp = new SingleValueLegacyExtendedProperty { Id = "String {00020329-0000-0000-C000-000000000046} Name VotingOptions", Value = "同意;不同意;待定;弃权" }; targetMessage.SingleValueExtendedProperties = new List<SingleValueLegacyExtendedProperty> { updatedVotingProp }; await graphClient.Me.Messages[messageId].PatchAsync(targetMessage);
4. 删除单值扩展属性
将扩展属性列表设为空即可移除:
var messageId = "目标邮件的ID"; var targetMessage = await graphClient.Me.Messages[messageId].GetAsync(); targetMessage.SingleValueExtendedProperties = new List<SingleValueLegacyExtendedProperty>(); await graphClient.Me.Messages[messageId].PatchAsync(targetMessage);
注意事项
- 扩展属性的ID格式必须严格遵循
String {实体GUID} Name 属性名,不同实体(如邮件、事件)对应不同的GUID,可参考Graph官方定义的实体类型GUID - 确保你的应用已申请对应的Microsoft Graph权限,比如邮件场景需要
Mail.ReadWrite权限 - 如果需要避免属性名冲突,也可以使用GUID形式的属性ID,格式为
String {GUID} Id {自定义GUID}
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

