Windows Mobile Support

  • Subscribe to our RSS feed.
  • Twitter
  • StumbleUpon
  • Reddit
  • Facebook
  • Digg
Showing posts with label reflection. Show all posts
Showing posts with label reflection. Show all posts

Friday, 17 August 2012

Windows 8 Metro App - How to debug JS that was loaded at runtime

Posted on 00:39 by Unknown
In the last period of time I had to work a lot with JavaScript and not for the UI, but for an entire Metro application on Windows 8. One of the nice features of JavaScript is the ability to access any kind of function and defining or overriding functions at runtime.
This feature is very powerful but also can create a lot of mess. In this moment if we would try to write a C# Metro Application we would not have the ability to load at runtime any kind of assembly or code. The “reflection” part on the .NET framework for Metro Application is not the one that we know from the normal .NET.
In JavaScript if we have a script like this:
(function(){
“use strict”
WinJS.Namespace.define(“MyClass”,{
doSomeAction: function(){
console.warn(“doSomeAction was called”);
}
});
})();
we could evaluate the script at runtime and call or instanced the object and functions that were defined.
The first step is to evaluate the script. Let assume that the definition of this script can be found in a string field named “source”. All we need to do to load this script is to call the “window.execScript” method.
var source = “ our code “;
window.execScript(source);
After this step we can call our classes and functions from our code like this:
MyClass.DoSomeAction();
Wow, very simple. In C# this would not be some simple, but the true is that I would never want to do something like this in C#. Maybe loading an assembly at runtime but this is all that I would like to do.
One big question for you now. How we can debug the code that is loaded dynamically?
You would say that it is not possible. We cannot put a breakpoint in the code that is loaded dynamically. In C# we have a method that stops the code and popup a message to the user to attach a debugger. In JavaScript this is possible using “debugger”. In every place where framework finds a debugger, the execution of code will stop like we would have a breakpoint.
We saw how we can load dynamic code at runtime how we can debug it. This is a powerful feature but be aware. Loading code at runtime is not the best thing do to when we talk about performance. Also a lot of security issues can appear. This can be the tool of devil :-).

Read More
Posted in debug, dynamic, java script, javascript, Metro App, reflection, windows 8 | No comments

Thursday, 22 March 2012

How to get friendly format for GetType().Name

Posted on 08:18 by Unknown
Pornim de la urmatorul exemplu:
List<string> list = new List<string>();
Console.WriteLine(list.GetType().Name);
Asa cum ne-am astepta ne este returnat "List`1". Dar uneori nu ne este de ajuns atata, vrem sa vedem si tipul generci. Ceva de genul acesta "List". Pentru acest lucru avem nevoie sa apelam metoda GetGenericArguments pentru a obtine tipuriile generice.
Mai jos gasiti un extension method la Type care returneaza numele la type asa cum l-am prezentat mai sus.
public static class TypeExtensions
{
private const string TypeSeparator=",";
private const char UnusedSymbol = '`';
private const string TypeFormat = "{0}<{1}>";

public static string ToGenericTypeString(this Type type)
{
if (!type.IsGenericType)
{
return type.Name;
}

return string.Format(TypeFormat,
GetGenericTypeName(type),
GetGenericArgumentsName(type));
}

private static string GetGenericArgumentsName(Type type)
{
return string.Join(
TypeSeparator,
type.GetGenericArguments()
.Select(ToGenericTypeString).ToArray());
}

private static string GetGenericTypeName(Type type)
{
string typeName =type.GetGenericTypeDefinition().Name;
return typeName.Substring(0, typeName.IndexOf(UnusedSymbol));
}
}
Enjoy!

Read More
Posted in reflection | No comments

Tuesday, 20 March 2012

Access a property using reflection

Posted on 01:00 by Unknown
Cum putem face get/set la o proprietate prin intermediul la reflection. Odata ce avem tipul obiectului care contine proprietate, este de ajuns sa apelam InvokeMember si sa specificam numele proprietatii.
private TReturn GetProperty<TReturn>(object obj, string propertyName)
{
return (TReturn) obj.GetType().InvokeMember(
propertyName,
BindingFlags.GetProperty,
null,
obj,
null);
}

private void SetProperty(object obj, string propertyName, object value)
{
obj.GetType().InvokeMember(
propertyName,
BindingFlags.SetProperty,
null,
obj,
new object[] { value });
}
BindingsFlags se poate seta printr-un OR logic, in functie de proprietatea cu care lucram( publica, privata, statica, etc). De exemplu, pentru o proprietate publica si care nu este statica putem sa avem urmatorul apel:
 obj.GetType().InvokeMember(
propertyName,
BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty,
Type.DefaultBinder,
obj,
new object[] { value });
O alta modalitate de a lucra cu proprietati este sa obtim o instanta la PropertyInfo pentru proprietatea noastra, iar apoi sa facem get/set pe aceasta in felul urmator:
PropertyInfo propertyInfo = obj.GetType().GetProperty(propertyName);
propertyInfo.SetValue(obj, value, null);
Nu trebuie sa uitam ca numele la proprietate este case-sensitive.
Am incercat sa compar accesul direct la o proprietate cu cel prin reflection pentru 100.000.000 de accesari. Accesul proprietatilor prin reflection este cu circa 150 de ori mai lent decat prin accesul direct a unei proprietati. Per secunda, am avut circa ~145.000.000 de iteratii pe secunda pentru accesul direct in comparatie cu circa ~940.000.000 de iteratii pe secunde pentru accesul prin reflection.
Dar codul care folosea reflection nu a fost deloc optimizat. O sa revin cu un post in care o sa facem o optimizare a codului care foloseste reflection.
Enjoy!
Read More
Posted in property, reflection | No comments

Friday, 22 April 2011

Adnotare enum cu mai multe valori

Posted on 06:35 by Unknown
Cand dorim sa serializam un enum putem sa atasam la valoarea fiecarui item din enum atributul XmlEnumAttribute. Astfel la serializare/deserializare o sa putem lucra cu o valoarea string nu cu o valoare numerica.
Pana aici nici o problema, dar cum facem sa obtinem doar aceasta valoarea si nu un xml care contine si aceasta valoarea . De exemplu pentru enum-ul:
public enum Dimension
{
[XmlEnum(Name="BigT")]
Big
[XmlEnum(Name="SmallT")]
Small
}

am obține folosindu-ne de XmlSerializer un output care contine si un nod care specifica ce tip de data ii. Pentru a putea sa obtinem doar valoare BigT sau SmallT putem sa apelam la reflection si sa iteram prin atributele item-ului respectiv pana ajungem la un atribut de tip XmlEnumAttribute.
Acuma, daca ducem problema umpic mai departe, putem sa ajungem la cazuri in care elementele din enum au diferite valori. De exemplu daca lucram cu doua sau mai multe aplicații, putem sa avem doua sau mai multe reprezentări pentru aceiasi valoare. De exemplu o aplicație poate sa isi noteze valoare Big cu BigT, iar alta cu BigState. La prima strigare putem sa scriem un swith, iar in funcție de sistemul de unde preluam sau trimitem date sa avem o anumita valoare.
O solutie mai generala este sa scriem doua metode care sa stie sa convertească un string intr-un enum in functie de valoarea atributelor cu care adnotam un anumit item din enum. De exemplu in exemplul dat mai sus putem sa avem:
public enum Dimension
{
[FirstSystem("BigT")]
[SecondSystem("BigState")]
Big
[FirstSystem(Name="SmallT")]
[SecondSystem("SmallState")]
Small
}
In felul acesta, putem sa avem oricate valori pentru un anum. Atributele custom pe care le-am definit trebuie sa mosteneasca din clasa XmlEnumAttribute. Se poate scrie si un atribut custom, dar am folosit aceasta clasa deoarece deja continea o valoare de tip string.
Mai jos gasiti doua metode care ne permit sa convertim un enum in string si viceversa pe baza atributelor. Pentru a putea obtine valorea unui atribut este nevoie sa iteram prin toata lista de atribute pana ajungem la atributul pe care noi il dorim.
 public static string GetAttributeValue<TAttribute>(Enum @enum)
where TAttribute: XmlEnumAttribute
{
Type enumType = @enum.GetType();
Type attributeType = typeof (TAttribute);
FieldInfo info = enumType.GetField(@enum.ToString("G"));
if (!info.IsDefined(typeof(XmlEnumAttribute), false))
{
return @enum.ToString("G");
}

foreach (var customAttribute in info.GetCustomAttributes(attributeType, false))
{
if (customAttribute.GetType() == attributeType)
{
XmlEnumAttribute attribute = (XmlEnumAttribute)customAttribute;
return attribute.Name;
}
}

throw new Exception("The given attribute could not be found.");
}


public static TEnum GetEnumByAttributeValue<TEnum,TAttribute>(string value)
where TAttribute: XmlEnumAttribute
{
Type enumType = typeof(TEnum);

foreach (var item in Enum.GetValues(enumType))
{
if(GetAttributeValue<TAttribute>((Enum)item)==value)
{
return (TEnum)Enum.Parse(enumType, item.ToString());
}
}

throw new IndexOutOfRangeException(string.Format("The {0} attribute value cannot be found on the {1} enum", value, enumType.Name));
}
Read More
Posted in Convert, enum, reflection, serializare, serialization, xml | No comments
Older Posts Home
Subscribe to: Posts (Atom)

Popular Posts

  • E-Learning Vendors Attempt to Morph Mobile
    The sign should read: " Don't touch! Wet Paint !" I had a good chuckle today after receiving my latest emailed copy of the eLe...
  • Content Types - Level 6: Rich Media
    Level 6: Rich Media NOTE: This is part 7 of 7 and the conclusion of this continuing series; please see earlier posts for more background inf...
  • CDN is not the only solution to improve the page speed - Reverse Caching Proxy
    I heard more and more often think like this: “If your website is to slow, you should use a CDN.” Great, CDN is THE solution for any kind of ...
  • Publishing our CellCast Widget for iPad
    The rush has been on this week as our development team worked to design a new version of our CellCast Widget specifically for Apple's up...
  • NetCamp 2012 - Windows 8 development experience
    During this week I participate to NetCamp 2012.  This was the 6th NetCamp event and is organizing by Evensys. NetCamp is a dedicated event f...
  • SQL - UNION and UNION ALL
    I think that all of us used until now UNION in a SQLstatement. Using this operator we can combine the result of 2 queries. For example we wa...
  • Password/Token/PIN definition
    Password, Token, PIN, Passcode… every day we use this items when we need to authenticate in different systems. I observed that there are tim...
  • Shared Access Signature and URL encoding on Windows Azure
    Playing a little with Shared Access Signature was quite nice. In this moment this new functionality has a great potential. Playing a little ...
  • Content Types - Level 4: Reference
    Level 4: Reference Materials & Static Content NOTE: This is part 5 of 7 in a continuing series; please see earlier posts for more backgr...
  • Content Types - Level 5: Courseware
    Level 5: Content and Courseware NOTE: This is part 6 of 7 in a continuing series; please see earlier posts for more background information. ...

Categories

  • .NET
  • .NET nice to have
  • #if DEBUG
  • 15 iunie 2011
  • 15 octombrie 2011
  • 2011
  • abstracta
  • action
  • adaugare
  • ajax
  • Amsterdam
  • Android
  • aplicatii
  • App Fabric
  • Apple iSlate
  • array
  • as
  • ASP.NET
  • AsReadOnly
  • Assembly comun
  • async
  • Asynchronous programming
  • asyncron
  • Autofac
  • AutoMapper
  • az
  • Azure
  • Azure AppFabric Cache
  • Azure backup solution
  • Azure Storage Explorer
  • azure. cloud
  • backup
  • BCP utility
  • bing maps v7
  • BitArray
  • BlackBerry
  • blob
  • BlobContainerPublicAccessType
  • breakpoint
  • bucuresti
  • C#
  • cache
  • CallerMemberName
  • CellCast
  • Certificate
  • CES
  • change
  • ChannelFactory
  • clasa
  • classinitialize
  • clean code
  • click event
  • close
  • Cloud
  • Cluj
  • cluj-napoca
  • Code contracts
  • code retrat
  • codecamp
  • CollectionAssert
  • Compact Edition
  • compara
  • Comparer T .Default
  • CompareTo
  • comparison
  • comunitate
  • concurs
  • Conditional attribute
  • configurare
  • connection string
  • container
  • content type
  • control
  • Convert
  • convertAll
  • convertor
  • cross platform
  • CRUD
  • css
  • custom properties
  • custom request
  • DACPAC
  • Daniel Andres
  • data sync service
  • database
  • date time
  • datetime
  • debug
  • default
  • delegate
  • dependency injection
  • deploy
  • DeploymentItem
  • design patterns
  • Dev de Amsterdam
  • development stoage
  • dictionary
  • diferente
  • digging
  • director
  • Directory.Exist
  • disable
  • dispatcher
  • dispose
  • dropdown
  • dynamic
  • EF
  • email
  • encoding
  • entity framework
  • enum
  • enumerable
  • Environment.NewLine
  • error
  • error 404
  • error handling
  • eveniment
  • event
  • ews
  • excel
  • exception
  • exchange
  • exita
  • explicit
  • export
  • extension
  • field
  • File.Exist
  • finalize
  • fire and forget
  • Fluent interface pattern
  • format
  • func
  • GC.SuppressFinalize
  • generic
  • getdirectoryname
  • globalization
  • gmail
  • hackathon
  • Hadoop
  • handle
  • HTML
  • html 5
  • Html.ActionLink
  • http://www.blogger.com/img/blank.gif
  • HttpModule
  • IComparable
  • IE
  • ienumerable
  • IIS
  • image
  • implicit
  • import
  • int
  • internationalization
  • Internet Explorer
  • interop
  • Ioc
  • IP Filter
  • iPhone
  • iQuest
  • IStructuralEquatable
  • ITCamp
  • itspark
  • java script
  • javascript
  • July 2012
  • KeyedByTypeCollection
  • KeyNotFoundException
  • Kinect SDK
  • lambda expression
  • LightSwitch Microsoft Silverlight
  • linq
  • list
  • lista
  • lista servicii
  • liste
  • Live Connect
  • Live ID
  • load
  • localization
  • lock
  • m-learning
  • MAC
  • Mango
  • map
  • mapare
  • mapare propietati
  • messagequeue
  • meta properties
  • method
  • MethodImpl
  • Metro App
  • Microsoft
  • Microsoft Sync Framework
  • mlearning
  • mlearning devices
  • Mobile Apps
  • mobile in the cloud
  • mobile learning
  • mobile services
  • Mobile Web
  • mongoDb
  • monitorizare
  • msmq
  • multitasking
  • MVC
  • MVC 3
  • MVVM
  • namespace
  • nextpartitionkey
  • nextrowkey
  • Ninject
  • nivel acces
  • no result
  • normalize
  • nosql
  • null expcetion
  • null object pattern
  • NullReferenceException
  • OAuth API
  • office
  • offline
  • Open ID
  • openhackeu2011
  • operations
  • operator
  • optimization
  • option
  • outputcache
  • OutputCacheProvider
  • override
  • paginare
  • pagination
  • path
  • persistare
  • Portable Library tool
  • Post event – CodeCamp Cluj-Napoca
  • predicate
  • predictions
  • prezentare
  • process
  • proiect
  • property
  • propietati
  • query
  • ReadOnlyCollection
  • ReadOnlyDictionary
  • referinta
  • reflection
  • remote
  • reply command
  • request
  • request response
  • resouce
  • REST
  • REST Client
  • RESTSharp
  • ronua
  • rss
  • rulare
  • salvare in fisier
  • sc
  • schimbare timp
  • select
  • select nodes
  • send
  • serializare
  • serialization
  • Server.Transfer. Resposen.Redirect
  • service bus
  • ServiceBase
  • servicecontroller
  • sesiune
  • session
  • Session_End
  • Session_Start
  • setup
  • Sibiu
  • signalR
  • Silverlight
  • sincronizare
  • Single Responsibility Principle
  • SkyDrive
  • skype
  • smartphones
  • smtp
  • Snapguide
  • sniffer
  • socket
  • solid
  • spec#
  • sql
  • Sql Azure
  • SQL CE
  • sql server 2008 RC
  • SRP
  • startuptype
  • stateful
  • stateless
  • static
  • stergere
  • store
  • store procedure
  • stream
  • string
  • string.join
  • struct
  • StructuralEqualityComparer
  • submit
  • switch
  • Symbian
  • Synchronized
  • system
  • tabele
  • table
  • techEd 2012
  • tempdata
  • test
  • testcleanup
  • testinitialize
  • testmethod
  • thread
  • timer
  • ToLower
  • tool
  • tostring
  • Total Cost Calculator
  • trace ASP.NET
  • transcoding
  • tuplu
  • tutorial
  • TWmLearning
  • type
  • unit test
  • unittest
  • UrlParameter.Optional
  • Validate
  • validation
  • verificare
  • video
  • view
  • ViewBag
  • virtual
  • visual studio
  • VM role
  • Vunvulea Radu
  • wallpaper
  • WCF
  • WebBrower
  • WebRequest
  • where clause
  • Windows
  • windows 8
  • Windows Azure
  • Windows Azure Service Management CmdLets
  • windows live messenger
  • Windows Mobile
  • Windows Phone
  • windows service
  • windows store application
  • Windows Task
  • WinRT
  • word
  • workaround
  • XBox
  • xml
  • xmlns
  • XNA
  • xpath
  • YMesseger
  • Yonder
  • Zip

Blog Archive

  • ▼  2013 (139)
    • ▼  November (17)
      • Service Bus - Optimize consumers using prefetch an...
      • Extract relative Uri using MakeRelativeUri method
      • Sync Group - Let's talk about Performance
      • [PostEvent] Slides from MSSummit 2013, Bucharest
      • How to get the instance index of a web role or wor...
      • Sync Group - A good solution to synchronize SQL Da...
      • Throttling and Availability over Windows Azure Ser...
      • How to monitor clients that access your blob storage?
      • Digging through SignalR - Dependency Resolver
      • [Event] Global Day of Coderetreat in Cluj-Napoca! ...
      • Windows Azure Service Bus - What ports are used
      • Debugging in production
      • Simple load balancer for SQL Server Database
      • [PostEvent] MSSummit 2013, Bucharest
      • How to read response time when you run a performan...
      • VM and load balancer, direct server return, availa...
      • Bugs that cover each other
    • ►  October (12)
    • ►  September (10)
    • ►  August (7)
    • ►  July (8)
    • ►  June (15)
    • ►  May (12)
    • ►  April (17)
    • ►  March (16)
    • ►  February (9)
    • ►  January (16)
  • ►  2012 (251)
    • ►  December (9)
    • ►  November (19)
    • ►  October (26)
    • ►  September (13)
    • ►  August (35)
    • ►  July (28)
    • ►  June (27)
    • ►  May (24)
    • ►  April (18)
    • ►  March (17)
    • ►  February (20)
    • ►  January (15)
  • ►  2011 (127)
    • ►  December (11)
    • ►  November (20)
    • ►  October (8)
    • ►  September (8)
    • ►  August (8)
    • ►  July (10)
    • ►  June (5)
    • ►  May (8)
    • ►  April (9)
    • ►  March (14)
    • ►  February (20)
    • ►  January (6)
  • ►  2010 (26)
    • ►  December (1)
    • ►  November (1)
    • ►  October (1)
    • ►  June (2)
    • ►  May (1)
    • ►  April (4)
    • ►  March (1)
    • ►  February (1)
    • ►  January (14)
Powered by Blogger.

About Me

Unknown
View my complete profile