如何在运行时从类中删除属性

13

在运行时从类中删除属性是否可行,例如:

public Class A
{
  public int num1 {get;set;}
  public int num2 {get;set;}
  public int num3 {get;set;}
}

Class A Obj = new A();

我想在运行时从obj中删除num2。这可能吗?


你想要删除的是属性(property),而不是特性(attribute)。 - Anton Tykhyy
1
不,这是不可能的,所以你或许应该询问一下你想要实现什么,而不是询问你认为可以用来解决它的方法。 - Guffa
你在这里究竟想做什么?你确定要完全删除 num2 属性(以此破坏使用该属性的其他代码)吗?或者你只是不想让它出现在智能感知中…? - MattDavey
8个回答

13

无法完成此操作。一旦编译,类定义便会固定。


1

我有一个非常精确的用例。在我的情况下,当通过Json将数据模型发布到ODATA时,我想忽略一些属性。这个属性可能不是表字段,所以我想在将其序列化为JSON时忽略它。我通过以下步骤实现了这一点。

  • 我使用DataAnnotations将该属性装饰为[ReadOnly(true)]
  • 然后我创建了一个自定义的JsonSerializer从ISerializer来忽略只读属性,如下所示:
public string Serialize(object obj)
{
    return JsonSerializer.Serialize(obj,
           new JsonSerializerOptions
           {
               IgnoreReadOnlyProperties = true
           });
}

这解决了我的问题,可以忽略一些我不想通过Json/OData调用或任何Api/端点传递的属性。

1

正如其他人已经说过的,这是不可能的。

相反,您可以添加另一个属性,例如:

public List<string> ignoredProperties {get; set;}

然后在运行时将num2添加到该列表中,并检查应忽略的属性。


0

你需要采用模型/视图模型的方法。创建一个视图模型,其中包含满足你需求的有限属性。


0

我同意Nic的回复:这是不可能的。一旦编译,类定义就被确定了。

但是你可以通过反射动态地创建一个你想要的类属性。


0

我无法删除该属性,我试图创建一个动态JSON,将两个不同的类合并在一起,但是没有某些属性(对于该合并类不需要),所以我添加了一个自定义属性并添加到我不需要的字段/属性,并使用反射在运行时创建自定义JSON,然后合并2个类。


0
//Convert your object to JObject
var jsonDoc = JObject.FromObject(doc);
//Select the Property To Remove
var PropertyToRemove= jsonDoc.Property("PropertyToRemove");
// Remove the Property
sig.Remove();

0

我的情况要简单得多。

我有一个类是POST的,
然后我需要删除一些属性并将其保存为JSON。
我使用了System.Dynamic.ExpandoObject来复制这个类。

            Object value;
            
            System.Dynamic.ExpandoObject cloneData = JsonSerializer.Deserialize<ExpandoObject>(JsonSerializer.Serialize(data));
           
            cloneData.Remove("IP", out value);
            value = value;
            cloneData.Remove("analytics", out value);
            value = value;


            string azurecontainer = @"data";
            string azureblobJSONDataFilename = @"profile/" + _userInfoSessionB.u + @".json";
            string JSONData = JsonSerializer.Serialize(cloneData);
            object p = azureStorage.UploadBlob2ContainerTextAsync(JSONData, azurecontainer, azureblobJSONDataFilename, "application/json", "public, max-age=30");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接