题
我需要像这样在某些属性类一个GUID属性:
public class SomeAttribute : Attribute {
private Guid foreignIdentificator;
public Guid ForeignIdentificator {
get { return this.foreignIdentificator; }
set { this.foreignIdentificator = value; }
}
}
但在属性定义我只能使用基本类型,这是常数(我明白为什么,它是让我感觉)。解决方法可以是定义“ForeignIdentificator”为字符串,并在运行时创建GUID:
public class SomeAttribute : Attribute {
private string foreignIdentificator;
public string ForeignIdentificator {
get { return this.foreignIdentificator; }
set { this.foreignIdentificator = value; }
}
public Guid ForeignIdentificatorGuid {
get { return new Guid( ForeignIdentificator ); }
}
}
Unahppily我松散检查用于类型安全。所述“ForeignIdentificator”属性可以包含任何的字符串值和创建的Guid将在运行时被抛出的异常,而不是在编译时期间。
我知道“System.Runtime.InteropServices.GuidAttribute”为“GUID兼容性”的编译器检查字符串值。这种检查是正是我需要的,但我不知道是否该检查我的编译器硬编码或者我可以明确定义(以及如何)。
你知道一些方法,如何确保“GUID了兼容性”检查属性?或者一些其他的方式,如何达到的属性类型安全的Guid定义? 感谢。
解决方案
我遇到了在过去您的具体问题。我们只是要求他们在GUID来作为一个字符串传递...的默认方式是,VS GUID生成工具把它交给我们(* F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4)。我们基本上是做你做了什么。我们用它的插件架构,使我们的客户已经使用该接口的人。如果你看一下微软做什么时,他们需要做同样的事情,他们这样做。
这并不是一个问题,做这种方式。不只一次,我们已经看到了这一点从现场的问题。
您可能要命名该字符串场GUID,不过,为了不混淆你的消费者。添加的情况下,一些文件,他们不知道它需要什么格式。
我有同样的反应,当我看着这个......但后来我刚搬来的,因为它似乎是没有类型安全的解决方案。
其他提示
属性参数必须是恒定的。如果我违反规则,我的C#编译器会发出此错误:
的属性参数必须是常量表达式的typeof属性参数类型的表达或数组创建表达式
由于在C#没有GUID文字,必须将一个串编码的GUID以另一种格式,例如。但是,你不能完全在海上:你可以让你的属性有一个构造函数,把你想要的格式。下面是用相同的构建函数作为System.Guid
的示例:
[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
sealed class MyGuidAttribute : Attribute
{
public Guid Guid { get; private set; }
//
// Summary:
// Initializes a new instance of the System.Guid class using the specified array
// of bytes.
//
// Parameters:
// b:
// A 16 element byte array containing values with which to initialize the GUID.
//
// Exceptions:
// System.ArgumentNullException:
// b is null.
//
// System.ArgumentException:
// b is not 16 bytes long.
public MyGuidAttribute(byte[] b)
{
this.Guid = new Guid(b);
}
//
// Summary:
// Initializes a new instance of the System.Guid class using the value represented
// by the specified string.
//
// Parameters:
// g:
// A System.String that contains a GUID in one of the following formats ('d'
// represents a hexadecimal digit whose case is ignored): 32 contiguous digits:
// dddddddddddddddddddddddddddddddd -or- Groups of 8, 4, 4, 4, and 12 digits
// with hyphens between the groups. The entire GUID can optionally be enclosed
// in matching braces or parentheses: dddddddd-dddd-dddd-dddd-dddddddddddd -or-
// {dddddddd-dddd-dddd-dddd-dddddddddddd} -or- (dddddddd-dddd-dddd-dddd-dddddddddddd)
// -or- Groups of 8, 4, and 4 digits, and a subset of eight groups of 2 digits,
// with each group prefixed by "0x" or "0X", and separated by commas. The entire
// GUID, as well as the subset, is enclosed in matching braces: {0xdddddddd,
// 0xdddd, 0xdddd,{0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd,0xdd}} All braces, commas,
// and "0x" prefixes are required. All embedded spaces are ignored. All leading
// zeroes in a group are ignored. The digits shown in a group are the maximum
// number of meaningful digits that can appear in that group. You can specify
// from 1 to the number of digits shown for a group. The specified digits are
// assumed to be the low order digits of the group.
//
// Exceptions:
// System.ArgumentNullException:
// g is null.
//
// System.FormatException:
// The format of g is invalid.
//
// System.OverflowException:
// The format of g is invalid.
public MyGuidAttribute(string g)
{
this.Guid = new Guid(g);
}
//
// Summary:
// Initializes a new instance of the System.Guid class using the specified integers
// and byte array.
//
// Parameters:
// a:
// The first 4 bytes of the GUID.
//
// b:
// The next 2 bytes of the GUID.
//
// c:
// The next 2 bytes of the GUID.
//
// d:
// The remaining 8 bytes of the GUID.
//
// Exceptions:
// System.ArgumentNullException:
// d is null.
//
// System.ArgumentException:
// d is not 8 bytes long.
public MyGuidAttribute(int a, short b, short c, byte[] d)
{
this.Guid = new Guid(a, b, c, d);
}
//
// Summary:
// Initializes a new instance of the System.Guid class using the specified integers
// and bytes.
//
// Parameters:
// a:
// The first 4 bytes of the GUID.
//
// b:
// The next 2 bytes of the GUID.
//
// c:
// The next 2 bytes of the GUID.
//
// d:
// The next byte of the GUID.
//
// e:
// The next byte of the GUID.
//
// f:
// The next byte of the GUID.
//
// g:
// The next byte of the GUID.
//
// h:
// The next byte of the GUID.
//
// i:
// The next byte of the GUID.
//
// j:
// The next byte of the GUID.
//
// k:
// The next byte of the GUID.
public MyGuidAttribute(int a, short b, short c, byte d, byte e, byte f, byte g, byte h, byte i, byte j, byte k)
{
this.Guid = new Guid(a, b, c, d, e, f, g, h, i, j, k);
}
//
// Summary:
// Initializes a new instance of the System.Guid class using the specified unsigned
// integers and bytes.
//
// Parameters:
// a:
// The first 4 bytes of the GUID.
//
// b:
// The next 2 bytes of the GUID.
//
// c:
// The next 2 bytes of the GUID.
//
// d:
// The next byte of the GUID.
//
// e:
// The next byte of the GUID.
//
// f:
// The next byte of the GUID.
//
// g:
// The next byte of the GUID.
//
// h:
// The next byte of the GUID.
//
// i:
// The next byte of the GUID.
//
// j:
// The next byte of the GUID.
//
// k:
// The next byte of the GUID.
[CLSCompliant(false)]
public MyGuidAttribute(uint a, ushort b, ushort c, byte d, byte e, byte f, byte g, byte h, byte i, byte j, byte k)
{
this.Guid = new Guid(a, b, c, d, e, f, g, h, i, j, k);
}
}