|
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.
|
|
|
|
|
I had a third party dll on which COM interoperability was not built in. I wrote my own C# dll which provided the wrappers for the functions inside the third party dll and in my dll, I added COM interop. My C# dll works fine if I use it in a C# application but whenever I call it from C++ using COM pointers, then no statement in the function is executed if that function uses any component inside third party dll.
In the following code, not even the messagebox will pop up which means as if the function is not even called. But if I remove, the last two lines of code, then messagebox will properly pop up.
<br />
public void MyDllFunc()<br />
{<br />
MessageBox.Show("Inside MyDllfFunc");<br />
<br />
ThirdPartyDllClass service = new ThirdPartyDllClass ();<br />
service.DoSomething();<br />
}<br />
It seems that if I am using a main dll which internaly uses some other dll, then both dlls should support COM interop if i want to make the main dll COMVisible.
Any ideas/suggestion/advice?
For COM interop, I am generating a tlb using regasm and then importing that tlb in my C++ application. Is there any other way through which I can achieve calling the third party dll from my C++ application?
Thank you.
the fruits of your success will be in direct ratio to the honesty and sincerity of your own efforts in keeping your own records, doing your own thinking and, reaching your own conclusions.
..surviving in autumn..in love with spring..
|
|
|
|