|
seems reasonable what you say
Thanks ! !
|
|
|
|
|
I have a generic method which looks for a specific attribute and returns value of "Text" property. My attribute is named "DetailsAttribute". Here is my generic method
public static string GetDescription<EnumType>(EnumType enumType) {
string description = string.Empty;
Type type = enumType.GetType();
if (type != null) {
FieldInfo info = type.GetField(enumType.ToString());
if (info != null) {
DetailsAttribute[] attributes = info.GetCustomAttributes(typeof(DetailsAttribute), false) as DetailsAttribute[];
if (attributes != null && attributes.Length > 0)
description = attributes[0].Text;
}
}
return description;
} This works fine. But I am looking for applying a constraint to the generic parameter "enumType" which should allow only enum types. I am not able to write something like
public static string GetDescription<EnumType>(EnumType enumType) : where enumType : enum
How can I set such kind of restriction ? Also is there any better method than what I provided to retrieve attribute values from fields ?
any help would be appreciated.
|
|
|
|
|
N a v a n e e t h wrote: How can I set such kind of restriction ?
You cant. Best will be to have where EnumType : struct and have a check inside the method.
|
|
|
|
|
Yeah, I guessed it. Thanks leppie. Do you think there is any better method to take the attribute value other than what I did ?
|
|
|
|
|
Maybe you should check it by yourself.
Just like this:
public static string GetDescription<enumtype>(EnumType enumType) {
string description = string.Empty;
Type type = enumType.GetType();
Type typParent=type.BaseType;
bool blIsEnum=false;
while(typParent!=null)
{
if(typParent==typeof(System.Enum))
{
blIsEnum=true;
break;
}
typParent=typParent.BaseType;
}
if(blIsEnum==false)
{
throw new Exception("Haha,game over!^_^");
}
......
|
|
|
|
|
Thanks.
xibeifeijian wrote: Type type = enumType.GetType();
Type typParent=type.BaseType;
bool blIsEnum=false;
while(typParent!=null)
Why not make it simple like
if (enumType.GetType() != typeof(System.Enum))
throw new InvalidOperationException("An enum is expected"); or am I missing something ?
|
|
|
|
|
Ha,Sorry,my error.
As the enum type cann't inherit,so you can judge it in this way:
if (enumType.GetType().BaseType != typeof(System.Enum))
You must use basetype to judge them,because the son type won't equals the parent type.System.Enum is a root type for all the enum types.
|
|
|
|
|
Ya.. BaseType is required. Thanks
|
|
|
|
|
How about:
enumType is Enum ...
You guys certainly like to do things the hard way!
|
|
|
|
|
leppie wrote: enumType is Enum
Looks simple, but I cannot make it working. AFAIK, BaseType checking is required. When you use is , it throws exception for enum types too.
|
|
|
|
|
N a v a n e e t h wrote: Looks simple, but I cannot make it working. AFAIK, BaseType checking is required. When you use is, it throws exception for enum types too.
Then you are doing something wrong!
The following prints 'Friday':
object f = DayOfWeek.Friday;
if (f is Enum)
{
Console.WriteLine(f);
}
else
{
Console.WriteLine("Not enum");
}
|
|
|
|
|
Does no one read my articles?
I use:
System.Type basetype = typeof(T) ;
if ( !basetype.IsEnum )
{
throw ( new System.ArgumentException ( "T must be an Enum" ) ) ;
}
I suspect that all that checking for null in your example is needless.
And please read this[^].
|
|
|
|
|
Haha ,this is the best way !
|
|
|
|
|
PIEBALDconsult wrote: Does no one read my articles?
Sorry, I just missed it.
PIEBALDconsult wrote: I suspect that all that checking for null in your example is needless.
I am not getting you fully. Are you saying that the methods I used to get "FieldInfo", attributes will never return NULL ?
|
|
|
|
|
Correct. GetType() won't and GetCustomAttributes won't, GetField won't because you're passing in a known field name (in this case).
modified on Tuesday, July 8, 2008 12:41 AM
|
|
|
|
|
Thanks. I will remove the NULL checking. Thanks
|
|
|
|
|
PIEBALDconsult wrote: Does no one read my articles?
Hmmm...I missed that one somehow. Interesting approach to things. Did you see my article[^]? I have a similar GetDescription method.
Scott Dorman Microsoft® MVP - Visual C# | MCPD
President - Tampa Bay IASA
[ Blog][ Articles][ Forum Guidelines] Hey, hey, hey. Don't be mean. We don't have to be mean because, remember, no matter where you go, there you are. - Buckaroo Banzai
|
|
|
|
|
I probably did, I definitely remember the picture of someone blocking the Green Monster.
|
|
|
|
|
You can't apply a generic constraint on an enum type. The best you can get is struct. Also, take a look at this article[^] for a way to work with enums and a description attribute.
Scott Dorman Microsoft® MVP - Visual C# | MCPD
President - Tampa Bay IASA
[ Blog][ Articles][ Forum Guidelines] Hey, hey, hey. Don't be mean. We don't have to be mean because, remember, no matter where you go, there you are. - Buckaroo Banzai
|
|
|
|
|
Scott,
Thanks. I figured it out. Great article though
|
|
|
|
|
N a v a n e e t h wrote: Thanks. I figured it out. Great article though
You're welcome. Glad you liked the article.
Scott Dorman Microsoft® MVP - Visual C# | MCPD
President - Tampa Bay IASA
[ Blog][ Articles][ Forum Guidelines] Hey, hey, hey. Don't be mean. We don't have to be mean because, remember, no matter where you go, there you are. - Buckaroo Banzai
|
|
|
|
|
Oh, and... a few months ago I asked about it on MSDN and Jon Skeet said he'd ask whether or not an enum constraint might be in the future, he later reported... "maybe". I suspect there are a lot more important things concerning them.
I think maybe we should start a letter campaign.
|
|
|
|
|
PIEBALDconsult wrote: I asked about it on MSDN and Jon Skeet said he'd ask whether or not an enum constraint might be in the future,
Ohh, so what could replace enums ?
Jon Skeet - I love that guy. He got indepth knowledge on the subject and very helping too. He has a book out "C# in Depth". I got a copy, it's worth reading.
|
|
|
|
|
I meant it's possible that a future C# compiler will allow where T : enum
I'm not holding my breath, but apparently the team who can make it happen know there's some demand for it.
|
|
|
|
|
PIEBALDconsult wrote: I meant it's possible that a future C# compiler will allow where T : enum
I misunderstood you, now it's clear.
PIEBALDconsult wrote: know there's some demand for it.
Yeah. Let's hope it would come in the future versions.
|
|
|
|