Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / .NET Framework / CLR / September 2003

Tip: Looking for answers? Try searching our database.

Fine control over type instantiation

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Ben Blair - 15 Sep 2003 22:38 GMT
Hi All,

I'm looking for a way to cause type instantiation to call
a custom class factory instead of having the CLR create an
instance of the type on its own. Specifically, I need to
return a subclass instance when a new base class instance
is requested.

A simple class factory pattern would seem to work, except
that I need this to work with existing code that uses
the 'new' operator. I've got a library that can
automatically generate subclasses of existing classes but
with embedded monitoring code (and some other features).
Ideally, an existing application could use this simply by
making a small change in their runtime environment.
Requiring minor code changes in the application, such as
registering some event handlers on startup would be
acceptable. Requiring a user to replace all
 MyClass a = new MyClass();
with
 MyClass a = AClassFactory.CreateInstance();
is not acceptable. Not only would that require the
developer to make extensive changes, but it would require
them to know ahead of time which classes they wanted to
instrument and which they didn't. I feel pretty strongly
that there needs to be a way to (easily and automatically)
instrument any non-sealed class.

I have a couple of almost-solutions but none of them quite
work.

1) The AppDomain could support an event much like
TypeResolve except that it allows the event handler to
return a Type object rather than an Assembly object. I
can't find such an event and I can't figure out how to use
TypeResolve to accomplish the same thing, although it
might be possible. Also, TypeResolve only fires when the
CLR can't resolve the type on its own, instead of always.
Is there a way to trick TypeResolve into always firing?

2) Override the new operator. But this isn't allowed.

3) Create a subclass of Type that overrides
CreateInstance, GetConstructor, etc. I can't figure out
how to get the CLR to use this type object instead of the
base-class's type object. Also, this could have lots of
unintended consequences. But at the moment, it seems like
the only thing that might work.

4) Bend my rule a little bit and only support
instrumenting of objects created with
Activator.CreateInstance(). This is kind of ugly, but at
least it would keep the developer free to decide later
what to instrument if *all* uses of 'new' were replaced
with Activator.CreateInstance().

Any ideas or suggestions? Thanks.

- Ben Blair
- benblair@ Association for Computing Machinery dot org
John Saunders - 16 Sep 2003 01:29 GMT
> Hi All,
>
[quoted text clipped - 3 lines]
> return a subclass instance when a new base class instance
> is requested.

You can do this by creating a static method of the base class type and by
defining all constructors to be non-public.

There is no magical way to redefine the language to call your own class
factory.
Signature

John Saunders
Internet Engineer
john.saunders@surfcontrol.com

Dino Chiesa [MSFT] - 17 Sep 2003 23:21 GMT
Yes, you can intercept type instantiation in .NET.

suggestion:  get the book by Don Box called "Essential .NET"

In it there is a good discussion of the CLR and the .NET mechanisms for
interception, including the concepts of TransparentProxy, RealProxy, and
ContextBoundObject, and how to apply these capabilities using attributes.
You could do something like this:

 [MyInterceptor]
 public class MyClass : ContextBoundObject {
 }

and instantiations (and all other method calls) would be intercepted by the
MyInterceptor code.

Some links related to this:
http://www.hoppersoft.com/Andy/PermaLink.aspx/48168b49-6ae9-4833-95b2-d6bc64f5bb1d
http://blogs.gotdotnet.com/cbrumme/PermaLink.aspx/24e9e5f5-9923-4cf9-b097-9c018c
69d5cb

http://msdn.microsoft.com/msdnmag/issues/03/03/ContextsinNET/default.aspx

an instructional video describing the topic:
http://msdn.microsoft.com/msdntv/episode.aspx?xml=episodes/en/20030422NETFXDP/ma
nifest.xml


But danger! perf implications
http://urbanasylum.dynu.com/JustTheFacts/archives/000068.html

Cheers,
-Dino

also
http://www.gotdotnet.com/team/dbox/spoutlet.aspx?key=2002-11-24T22:16-08:00

> > Hi All,
> >
[quoted text clipped - 9 lines]
> There is no magical way to redefine the language to call your own class
> factory.
Ice - 19 Sep 2003 14:17 GMT
interception will work, will potentially be performance hog. if you could
modify source, you could have your factory accept an instance type and
create the proper subclass based on that.

ice
> Hi All,
>
[quoted text clipped - 56 lines]
> - Ben Blair
> - benblair@ Association for Computing Machinery dot org

Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.