Detect The Type Of A Generic At Compile Time Using Attributes
Nov 21, 2009
I may have a difficult question here. I am working on a Generic class that is meant to work specifically with Enum's. Right now, I get the type of the Generic on instantiation and make sure that it is an Enum and throw an exception if it is not. So:
I have a generic Class I'm using to hold information loaded from a database.I have a method which takes a DataRow as an argument, uses the object's known column name and extracts the data from the DataRow, such that:Dim loadData As T = CType(myDataRow("myColumnName"), T))works as my default assignment in most cases.Unfortunately, due to some horrifying design constraints, some of my columns may be null, and may also be taken from enumerations.This means that when <T> is Nullable(Of SomeEnumeration) the above code does not work because I can't cast 0 directly to SomeEnumeration.Zero.Is there some way to check whether <T> is Nullable(Of [Enum])? Or some way to write a method which allows Integers to be cast to Nullable(Of [Enum])?I feel like I'm forgetting something that would allow me to write one of the other of these, but my weak google-fu is turning up nothing.
EDIT: Okay, thanks to dasblinkenlight's answer below, I can detect when this circumstance is occurring, but what I need to do now is to take a type <T> which I know is Nullable(Of SomeClass), get a type reference to SomeClass and then create a new object of type Nullable(Of SomeClass) and assign that to LoadData.My problem was that I had a lot of difficulty in finding any function which would accept baseType as an actual Type.Parse accepted baseType as a parameter, I knew baseType was an [Enum] type because of dasblinkenlight's code, so I was, in this instance, able to code a solution. It's a solution which is very specific to my problem (i.e., T is Nullable(of SomeEnumeration)), but it's a solution nonetheless.
I have a code below to make collection that bind to a gridview able to sort by clicking on the column header. The problem here is "IPerson" is unknown at compile time. I want the delegate type able to decide by getting from gridview datasource.[code]....
I'm trying to write a class that will be in charge of persisting application options. Since the options need to be persisted the values that I'm sent must be serialisable.
Initially I thought I've be able to write a method with a signature like this[code]...
Public MustInherit Class Column Public ReadOnly Property ReturnSomethingUseful() As Object Get 'return something useful
[code]....
But this gives the following error:
Public Overrides Function ParseValue(sValue As String) As Boolean' cannot override 'Public Overridable Function ParseValue(sValue As String) As Object' because they differ by their return types.
I accept that you can't do this, but I'd like to be able to preserve the semantics of what I'm. trying to do, which is to have an untyped version that deals with Object, but a typed version in derived classes that knows about the specific type T.
I am trying to create a list of a generic type in vb.net 2.0 framework. This is the generic type definition:
Public Class GenericParamMap(Of T) Public Sub New(ByVal pParamName As String, ByVal pPropValue As T) mParamName = pParamName
[Code]....
The compiler does not allow a "T" in the method's parameter because it's not defined, but I'm not sure how or where to define it. I thought it was okay to have a generic method definition.
I am trying to write a generic method, to avoid code duplication, which will create or activate a Form as an MDI children, based on its type. But I have to lines in error (see comments).
I have a Linq-to-SQL class diagram in my web application containing the two tables in my database (held in a DBPro database project in the same solution). All was working fine yesterday. I start doing some work tonight and note that the solution compiles fine in Visual Studio, but when I run the web app I get a compilation error:
Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately. Compiler Error Message: BC30002: Type 'FrostAlertDatabaseDataContext' is not defined.
I'm compiling a VB.Net 2.0 app (created in VS2008) using msbuild, and now I've added a generic return type, it's giving me the following:
Warning: Type library exporter encountered a generic type instance in a signature. Generic code may not be exported to COM.
Having just spent ages removing all of the previous warnings, I don't really want to add a new one. Any idea how to get rid of it (aside from not using generics)?I don't know what details I'd put in the attribute, or what number to put in the project-level ignore list.
In trying to add a bit of usage variety to a generic class I'm working on, I ran into this issue with trying to cast an object into an interface instance where the interface is defined inside the generic class.
1) VB Allows non-type template parameters2) VB supports explicit specialization 3) VB allows the type parameters to be used as the base class for the generic type4) VB allows a generic type parameter itself to to be a generic 5) VB enforces that all codes are valid for all types of parametrs
Is there some clever way of getting the date and time of when the dll was built/compiled?
I'm using the assembly version numbering and reflection to retrieve and display this info when the app is deployed. But in some scenarios it would be more convenient to know when then dll was actually compiled rather than the auto incrementing version number. I don't think the modified date on the dll file itself is reliable due to the way the app is deployed.
Dim assemblies = AppDomain.CurrentDomain.GetAssemblies Dim assemblyName As String Dim assemblyVersion As String
I am having a problem while compiling one of my projects in vb.net. I have a solution consisting of multiple project,one of which is the exe. Now when i am trying to compile that project i get an error which states
I want to have a bunch of different screens, yet I don't want to have to use 20 different forms (I'm pretty sure that's bad practice anyways), and I don't want to lay down all the controls at once in the designer because then things get messy. I had an idea of running a sub on startup that would dynamically generate all the controls I need with all the right coordinates and settings, and then dump al the ones needed for a specific screen into a Panel. Then I return an ArrayList of panels, and pull out the correct panel to attach to the form when I need that screen. The only problem is that my form will not have any implicit knowledge of its controls, so I'm assuming I wouldn't be able to use the WithEvents / Handles. keywords to declare handlers in the form class (which is what I'd rather do).
I've been building tools for ArcGIS. Part of ArcGIS is toolboxes which is basically a collection of tools bundled together. I know how to make toolboxes, but the code I have runs within Arc itself - ie. currently it only runs when you actually start Arc up and run a tool which makes the toolbox.
In theory the code should be able to run outside of Arc and ideally I want it to run at compile time. I know you can run executables as pre and post build events when building the installer so I was thinking I could make it build the toolbox as part of one of these. Catch is, the executable code would need to have access to the compiled files of my project (it needs a link to each tool to build the toolbox) so I can't make the executable in a seperate project. The current project is a class library. Is there a way to run code within my project when building the installer?
Depending on a preprocessor directive, I want to set all properties in a class to EditorBrowsableAttribute.Never.
I thought about creating a custom attribute, derived from EditorBrowsableAttribute, but unfortunately that class is sealed.
I've had a look at ICustomTypeDescriptor, but in the GetProperties method, I can get hold of each property descriptor, but the attributes collection is readonly.
I am writing some simple utility applications in VB.NET. I am using Visual Studio 2010 Express.I'm trying to throw a FileFormatException exception in my code if a user specifies a file that has the wrong extension. Documentation indicates that this exception has been around since .NET 3.0. See
[URL]
However, Visual Studio gives me an error saying that System.IO.FileFormatException is not defined. It's not a typo, either. FileFormatException appears in the object browser in System.IO, but doesn't appear in the Intellisense drop down when I type System.IO.File.
Here is my simple function:
Function ValidateDBFile(ByVal DbFilePath As String) As Boolean ValidateDBFile = False If IO.File.Exists(DbFilePath) Then Dim flInfo As New IO.FileInfo(DbFilePath)
[code] i get an app error when running the app, because i didn't set the ID.I was wondering if there's a way to make sure the programmer assigns all properties in the class,and fail at COMPILE TIME rather than have to catch the error at runtime...
We have a project for a client that is written in VB.NET. In one of the projects, we have about 100 modules, which are all VERY simple. They're extension methods that convert between object types. Here is a small snippet:
Public Module ScheduleExtensions <System.Runtime.CompilerServices.Extension()> _ Public Function ToServicesData(ByVal source As Schedule) As ScheduleServicesData
Today I discovered that something I had assumed about VB.NET for many years was not true (worrying!). I assumed that a variable declared within a loop had a lifetime of the iteration it was declared in, but in fact it seems it has a lifetime of the whole procedure.[code]I had assumed an output of False, True, False, True but instead it is actually False, True, True, True..In C# the equivalent code would not compile as you would get a compile time error of Error "Use of unassigned local variable 'var1'".I realise there are many ways to fix this and that best practice would be to declare the variable outside of the loop and reset it at the beginning of every loop through.I find this behaviour so counter-intuitive to me that I would like at least a compile time warning in VB.NET when/if I do this. (I could also then set this on any projects I already have and get warning that would allow me to check that my assumptions aren't causing errors).Does anyone know how/if I can get this to generate a compile time warning in VB.NET? Am I the only one that finds this counter-intuitive?
I'm trying to declare a generic using a variable of type System.Type, with VB 2005, and haven't found the right approach. Consider the typical:
Dim m_GenObj As MyGenericObject(of T) Instead of using "T" I want to use a variable of System.Type, for something like: Dim m_MyType as Type Dim m_GenObj as MyGenericObject(of m_MyType)
Someone (w69rdy) in Stack Overflow helped me out with a great example to handle DB output, that could potentially be NULL, passed into a function. The problem is I can understand the method as written in C# but I am having a problem understanding how to rewrite the method in VB.NET. The method uses generics and I am lost. Here is the method written in C# ..
public T ParseValue<T>(System.Data.SqlClient.SqlDataReader reader, string column) { T result = default(T); if (!reader.IsDBNull(reader.GetOrdinal(column)))
[code].....
How is this written in VB.NET? How does the method signature change when returning a generic type?
I am working on a multi-form code. For some reason, this randomly began happening just about the time I finished my code. The intial form loads just fine, but when I go to click on any of the selected buttons, the code crashes. and I get an unhandled exception of type 'System.stackoverflowexception' occured. I have checked for any subs calling subs that call subs and I don't have anything of that nature. It is breaking at the point that is bolded and underlined.
Today I investigated a logical bug in our software and figured out that this is related to the way VB.NET thread variables inside a loop.Let's say I have the following code:
Dim numbers As New List(Of Integer) From {1, 2, 3, 4, 5} For Each number As Integer In numbers Dim isEven As Boolean
[code]....
The problem is that isEven is declared but not assigned.In this specific case, it would be correct to write dim isEven as Boolean = false but I haven't done this.In VB.NET, a variable that is declared inside a for loop keeps its value for the next itaration. This is by design: [URL]but this is also dangerous pitfall for programmers.
However, until now, I haven't been aware of this problem/behaviour. Until now.Most of our code base is C# anyway, which doesn't allow the use of an uninitialized variable, so there is no problem. But we have some legacy code that is written in VB.NET that we have to support. So the best thing would be to generate a warning or even an error in this specific case.But even with Option Explicit / Option Strict this does not generate a warning / an error.Is there a way make this a compile time error or maybe a way to check this with FxCop?
I have the following sample code in a VB.NET console application. It compiles and works, but feels like a hack. Is there a way to define EmptyChild so that it inherits from Intermediate(Of T As Class) without using the dummy EmptyClass?
Module Module1 Sub Main() Dim Child1 = New RealChild()[code].....
The other way to do this would be to move the generic code out of the Base class and then create 2 Intermediate classes like this [code]...
Then RealChild would inherit from the generic Intermediate and EmptyChild would inherit from the non-generic Intermediate. My problem with that solution is that the Base class is in a separate assembly and I need to keep the code that handles the generic type in that assembly. And there is functionality in the Intermediate class that does not belong in the assembly with the Base class.