gpt4 book ai didi

c# - 如何匹配自定义 PropertyGrid BrowsableAttributes 条目?

转载 作者:行者123 更新时间:2023-11-30 12:12:53 24 4
gpt4 key购买 nike

我有一个带有这段代码的类(KeywordProperties):

public class KeywordProperties
{
[DisplayMode("0-1,0-2,0-3,1-1,1-2,1-3,1-6,1-9,1-10,1-11,1-12,2-1,2-2,2-3,2-9,2-10,2-12,3-1,3-2,3-3,3-10,3-12,4-13,5,6")]
public string Onvaan { get; set; }

[DisplayMode("0-1,0-2,0-3,1-1,1-2,1-3,1-6,1-9,1-10,1-11,1-12,2-1,2-2,2-3,2-9,2-10,2-12,3-1,3-2,3-3,3-10,3-12,4-13,5,6")]
public string MozooKolli { get; set; }

[DisplayMode("0-10,1-10,3-10,3-12,5,6")]
public string EsmeDars { get; set; }

[DisplayMode("0-1,1-1,2-1,2-2,3-1,6")]
public string Sokhanraan { get; set; }

[DisplayMode("0-10,1-2,2-1,2-10,3-10,6")]
public string Modares { get; set; }
}

我还有另一个检查属性:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class DisplayModeAttribute : Attribute
{
private readonly string mode;
public DisplayModeAttribute(string mode)
{
this.mode = mode ?? "";
}
public override bool Match(object obj)
{
var other = obj as DisplayModeAttribute;
if (other == null) return false;

if (other.mode == mode) return true;

// allow for a comma-separated match, in either direction
if (mode.IndexOf(',') >= 0)
{
string[] tokens = mode.Split(',');
if (Array.IndexOf(tokens, other.mode) >= 0) return true;
}
else if (other.mode.IndexOf(',') >= 0)
{
string[] tokens = other.mode.Split(',');
if (Array.IndexOf(tokens, mode) >= 0) return true;
}
return false;
}
}

我想用这段代码在 propertygrid 中显示属性:

String Code = "":
KeywordProperties Kp = new KeywordProperties();
propertygrid1.SelectedObject = Kp;
propertygrid1.BrowsableAttributes = new AttributeCollection(new DisplayModeAttribute(Code));

当 Code vlue 为“0-1”或“5”或...(单值)时,我可以看到我的属性。但是,当代码使用“0-1,1-2”时,我在我的属性网格中看不到任何东西。

如何查看这些数据:

1- 代码为0-1 和 代码为1-2 的所有属性:

结果是:Onvaan,MozooKolli

2- 代码为0-1 或 代码为1-2 的所有属性:

结果是:Onvaan,MozooKolli,Sokhanraan,Modares

最佳答案

看来您的代码仅在 DisplayModeAttributes 都具有单个值时才匹配,或者一个包含单个值而另一个包含多个值;当两者都包含多个值时,它不会匹配它们,除非值列表相同。

要按原样使用您的代码,您可以更改填充 PropertyGrid.BrowsableAttributes 的方式:

propertygrid1.BrowsableAttributes = new AttributeCollection(
new DisplayModeAttribute("0-1"),
new DisplayModeAttribute("1-2")
// etc.
);

或者,要修复您的匹配代码,您可以将其替换为:

public override bool Match(object obj)
{
var other = obj as DisplayModeAttribute;

if (other == null)
return false;

if (other.mode == mode)
return true;

string[] modes = mode.Split(',');
string[] others = other.mode.Split(',');

var matches = modes.Intersect(others);

return matches.Count() > 0;
}

这使用了 LINQ Intersect方法,返回两个列表共有的元素。

关于c# - 如何匹配自定义 PropertyGrid BrowsableAttributes 条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12662496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com