|
Thanks
string myKeyType = "System.String";
string myValueType = "System.Double";
Type myType = typeof(KeyValuePair<,>);
Type[] typeArgs = { Type.GetType(myKeyType), Type.GetType(myValueType) };
Type fullType = myType.MakeGenericType(typeArgs);
object newInstance = Activator.CreateInstance(fullType, new object[] { "testKey", 5 });
It is my first problem: so solved.
But If then I have to use the object I do not want to cast it in the following way
KeyValuePair<string, double> casted = (KeyValuePair<string, double>)newInstance;
Since a priori I do not know the type of course..
object newInstance: how can use it?
|
|
|
|
|
You can use it with Reflection. With Reflection, you can call methods, set property values, pass parameters, and so on. I imagine you can Google what you want to do (e.g., "C# Reflection set property value") and you'll probably get the answer you're looking for. And that link I sent you to my tip/trick shows how to set a property using Reflection.
You could also dynamically construct expression trees and then compile them if you want code that works faster than Reflection, but I'm not as familiar with expression trees so you'd be on your own for that.
|
|
|
|
|
Also, maybe this is one reason you were having a problem:
Type[] typeArgs = { typeof(Type.GetType(myKeyType)), typeof(Type.GetType(myValueype)) };
You don't need to use typeof , as the GetType function returns a type.
|
|
|
|
|
I can almost guarantee that you don't want to do what you think you do. If you create a type via reflection, you can't use it in a normal compile-time way because the type is not known until runtime. That means you need to do everything about it through reflection, which is slow.
I still don't have a good understanding of what exactly you're trying to do, but generally you want to use a List<BaseClass> or List<Interface>, where all the classes you're picking between at runtime inherit from/implement the class/interface in question. Then you can use compile time method binding (i.e. write normal code) against the class/interface, and use the magic of OO (polymorphism) to get different functionality.
In this case it appears you already have the base classes, and in fact you just want the (compile time) class MyClass to be written in terms of Car and Moto. (I hope that MyClass is a dummy name! Make sure your classes have meaningful names.) I'm not even sure you need generics here. Remember that if you have
class MyClass {
void SomeMethod(Car car, Moto moto){ ... }
}
... you can pass any instance of a subclass of Car and/or Moto to it. The same applies if you're using a generic class at some point, for example if your implementation includes a List<Car> – you can still put an AudiA8 into that list, as long as that class inherits from Car, even if the class is loaded at runtime.
I suspect what you actually want is something like
class MyClass {
public Car Car { get; set; }
public Moto Moto { get; set; }
...
}
... and then to set the properties to instances of subclasses of Car and Moto as chosen at runtime.
|
|
|
|
|
not sure I have explained my problem.
I have string and I need to inizialize the class
So from may excel i get "AudiA8", "ZXR"
And I need to inizialize:
MyClass.SomeMethod(AudiA8,ZXR) //from string to class
|
|
|
|
|
You have not explained your problem. And you still haven't.
Here's the part you may not be getting. If AudiA8 is a Car (i.e. it inherits from Car, or implements ICar), then you can pass it to a method taking a car. That is, you can do
MyClass.SomeMethod(new AudiA8(), new ZXR());
... given
class AudiA8 : Car {
...
}
class ZXR : Moto {
...
}
and
class MyClass {
static void SomeMethod(Car car, Moto moto){ ... }
}
You don't need any runtime shenanigans with MyClass to make that work. You can still do this even if you're creating the cars/motos at runtime:
Car CreateCar(string classname){
return (Car)Activator.CreateInstance(classname);
}
Moto CreateMoto(string classname){
return (Moto)Activator.CreateInstance(classname);
}
void DoSomething(){
MyClass.SomeMethod(
CreateCar("YourNamespace.Cars.AudiA8"),
CreateMoto("YourNamespace.Motos.ZXR")
);
}
|
|
|
|
|
MyClass.SomeMethod(new AudiA8(), new ZXR());
... given
class AudiA8 : Car {
...
}
class ZXR : Moto {
...
}
yes but from excel i have a string "AudiA8" and not new AudiA8()
myClass<car, mot>
...generic need car as a type but not as string, but I have only string as input
|
|
|
|
|
Did you bother reading my previous post all the way to the bottom where it shows you how to instantiate a type from a string?
|
|
|
|
|
Yes sorry, I'm not able to fit the solution in my case
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestGeneric
{
class Program
{
static void Main(string[] args)
{
string myCar = "carA";
string myMoto = "motoB";
mPricer< (car) Activator.CreateInstance(myCar), (moto) Activator.CreateInstance(myMoto)> Pr = new mPricer< (car) Activator.CreateInstance(myCar), (moto) Activator.CreateInstance(myMoto)>();
}
}
public class mPricer<T, G>
where T:car, new()
where G : moto, new()
{
double total;
public mPricer()
{
T c = new T();
G m = new G();
total = c.GetPrice() + m.GetCost();
}
public void ShowTotal()
{
Console.WriteLine(total);
}
}
public abstract class car { abstract public double GetPrice();}
public class carA : car { public override double GetPrice() { return 11; } }
public class carB : car { public override double GetPrice() { return 12; } }
public abstract class moto { abstract public double GetCost(); }
public class motoA : moto { public override double GetCost() { return 7; } }
public class motoB : moto { public override double GetCost() { return 6; } }
}
modified 15-Feb-12 9:04am.
|
|
|
|
|
There is no reason why mPricer should construct these objects within its own constructor. Construct them outside and pass them in, statically typed as car and moto, as in my example.
// I need to obtain an istance of mPricer<carA,motoB> starting from strings
No, no you do not, and until you understand this you're going to keep tying yourself in knots. You need to obtain an instance of mPricer the car and moto instances of which are instantiated from strings. I already demonstrated how to do this.
You seem to show a fundamental lack of understanding of the difference between types and instances, and frankly until you get a grip on that you shouldn't be dabbling with this sort of runtime creation.
|
|
|
|
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestGeneric
{
class Program
{
static void Main(string[] args)
{
string myCar = "carA";
string myMoto = "motoB";
mPricer Pr = new mPricer(myCar,myMoto);
}
}
public class mPricer
{
double total;
public mPricer(string carId, string motoId)
{
Car c = (car) Activator.CreateInstance(myCar);
Moto m = (moto) Activator.CreateInstance(myMoto);
total = c.GetPrice() + m.GetCost();
}
public void ShowTotal()
{
Console.WriteLine(total);
}
}
public abstract class car { abstract public double GetPrice();}
public class carA : car { public override double GetPrice() { return 11; } }
public class carB : car { public override double GetPrice() { return 12; } }
public abstract class moto { abstract public double GetCost(); }
public class motoA : moto { public override double GetCost() { return 7; } }
public class motoB : moto { public override double GetCost() { return 6; } }
}
That, i think, should do it ... you don't need a generic class
Pedis ex oris
Quidquid latine dictum sit, altum sonatur
|
|
|
|
|
or better yet....
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestGeneric
{
class Program
{
static void Main(string[] args)
{
string myCar = "carA";
string myMoto = "motoB";
Car c = (car) Activator.CreateInstance(myCar);
Moto m = (moto) Activator.CreateInstance(myMoto);
mPricer Pr = new mPricer(c,m);
}
}
public class mPricer
{
double total;
public mPricer(Car c, Moto m)
{
total = c.GetPrice() + m.GetCost();
}
public void ShowTotal()
{
Console.WriteLine(total);
}
}
public abstract class car { abstract public double GetPrice();}
public class carA : car { public override double GetPrice() { return 11; } }
public class carB : car { public override double GetPrice() { return 12; } }
public abstract class moto { abstract public double GetCost(); }
public class motoA : moto { public override double GetCost() { return 7; } }
public class motoB : moto { public override double GetCost() { return 6; } }
}
it helps to think about the interface exposed by a type ... regardless of which runtime car class you have you always want to call GetPrice ... we require that all car classes expose a getPrice method so this is either declared on the base class or interface. since this base class contains all the common functionality required it is sufficient for use throughout mPricer
generics would only be required if you wanted to expose the car/moto instances and didn't want to require a cast to their runtime types but, in an interface driven design you should probably ask yourself WHY you need the runtime type
Pedis ex oris
Quidquid latine dictum sit, altum sonatur
|
|
|
|
|
Oky thanks a lot.
The problem is that mPrice is a hudge class and I can not change it.
public class mPricer<T, G>
Contrains are:
input as string
ublic class mPricer<t, g="">
So I think is not possible to solve my problem without changing the class
|
|
|
|
|
aye, if you cant modify mPricer you are in the unfortunate situation of being stuck with someone elses shoddy design ... we've all been there and you have my sympathy.
Pedis ex oris
Quidquid latine dictum sit, altum sonatur
|
|
|
|
|
Well, if the class is broken and you can't change it, then you're pretty screwed. You should have mentioned this in the original question :P.
How much can you 'not change it'? Is this because you don't have the source, or because someone has told you you can't? If the latter, ignore them and don't tell them, and make the trivial change to call a factory instead of using new() directly.
|
|
|
|
|
Are you sure you can compile it?
Activator.CreateIstance() doesn't accept string
|
|
|
|
|
You might be right there, answering from memory doesn't always work.
Try
Type carType = Type.GetType("MyNamespace.Cars.Car");
Car car = (Car)Activator.CreateInstance(carType);
|
|
|
|
|
Thanks, really I was missing some reference in my project.
Thanks for your replay It is very usefull. I'm finding a solution using your path..
|
|
|
|
|
TBH, i just copied those lines from the OPs example without thinking, however there is an overload for createInstance that takes assembly name and type name as strings.. so i minor tweak
Pedis ex oris
Quidquid latine dictum sit, altum sonatur
|
|
|
|
|
Thanks it is usefull for me as starting point to study more
|
|
|
|
|
Hi all:
I installed TFS 2010 with minimum requirement by using advanced wizard. So the TFS server has only IIS, and MS SQL databases without reporting services, and SharePoint server. I installed it with success. I tried to create an team project using MS Studio 2010 without success. Then I installed team explorer from the same disk as TFS server, and tried to create it, also without success.
When I create a team project, I have to pick a template. I tried agile ... or cmmi ... for template from pick up list, both without success. I searcedh on the internet for quite sometime, I did not found anything that helps. And I guess it may be caused by the lack of these supporting appliances such as report services from SQl and Sharepoint server. I've been a programmer for last 20 years. I really could not figure out where to fix it.
The error is the following from the log.
Please help me since I've stuck here for awhile. I thank you in advanced
2012-02-14T09:56:32 | Module: Microsoft.ProjectCreationWizard.Build | Thread: 4 | <Permission allow="ViewBuildDefinition, ViewBuilds" identity="[$$PROJECTNAME$$]\Readers" />
2012-02-14T09:56:32 | Module: Microsoft.ProjectCreationWizard.Build | Thread: 4 | Allowing permission(s) ViewBuildDefinition, ViewBuilds to account [nirttest]\Readers.
2012-02-14T09:56:32 | Module: Microsoft.ProjectCreationWizard.Build | Thread: 4 | <Permission allow="ViewBuildDefinition, QueueBuilds, ViewBuilds, EditBuildQuality" identity="[$$PROJECTNAME$$]\Contributors" />
2012-02-14T09:56:32 | Module: Microsoft.ProjectCreationWizard.Build | Thread: 4 | Allowing permission(s) ViewBuildDefinition, QueueBuilds, ViewBuilds, EditBuildQuality to account [nirttest]\Contributors.
2012-02-14T09:56:32 | Module: Microsoft.ProjectCreationWizard.Build | Thread: 4 | <Permission allow="ViewBuildDefinition, EditBuildDefinition, DeleteBuildDefinition, QueueBuilds, ManageBuildQueue, StopBuilds, ViewBuilds, EditBuildQuality, RetainIndefinitely, DeleteBuilds, ManageBuildQualities, DestroyBuilds" identity="[$$PROJECTNAME$$]\Builders" />
2012-02-14T09:56:32 | Module: Microsoft.ProjectCreationWizard.Build | Thread: 4 | Allowing permission(s) ViewBuildDefinition, EditBuildDefinition, DeleteBuildDefinition, QueueBuilds, ManageBuildQueue, StopBuilds, ViewBuilds, EditBuildQuality, RetainIndefinitely, DeleteBuilds, ManageBuildQualities, DestroyBuilds to account [nirttest]\Builders.
2012-02-14T09:56:32 | Module: Microsoft.ProjectCreationWizard.Build | Thread: 4 | <Permission allow="ViewBuildDefinition, EditBuildDefinition, DeleteBuildDefinition, QueueBuilds, ManageBuildQueue, StopBuilds, ViewBuilds, EditBuildQuality, RetainIndefinitely, DeleteBuilds, ManageBuildQualities, DestroyBuilds" identity="[$$PROJECTNAME$$]\$$PROJECTADMINGROUP$$" />
2012-02-14T09:56:32 | Module: Microsoft.ProjectCreationWizard.Build | Thread: 4 | Allowing permission(s) ViewBuildDefinition, EditBuildDefinition, DeleteBuildDefinition, QueueBuilds, ManageBuildQueue, StopBuilds, ViewBuilds, EditBuildQuality, RetainIndefinitely, DeleteBuilds, ManageBuildQualities, DestroyBuilds to account [nirttest]\Project Administrators.
2012-02-14T09:56:32 | Module: Microsoft.ProjectCreationWizard.Build | Thread: 4 | <Permission allow="ViewBuildDefinition, EditBuildDefinition, DeleteBuildDefinition, QueueBuilds, ManageBuildQueue, StopBuilds, ViewBuilds, EditBuildQuality, RetainIndefinitely, DeleteBuilds, ManageBuildQualities, DestroyBuilds, OverrideBuildCheckInValidation" identity="$$COLLECTIONADMINGROUP$$" />
2012-02-14T09:56:32 | Module: Microsoft.ProjectCreationWizard.Build | Thread: 4 | Allowing permission(s) ViewBuildDefinition, EditBuildDefinition, DeleteBuildDefinition, QueueBuilds, ManageBuildQueue, StopBuilds, ViewBuilds, EditBuildQuality, RetainIndefinitely, DeleteBuilds, ManageBuildQualities, DestroyBuilds, OverrideBuildCheckInValidation to account vstfs:///Framework/IdentityDomain/98d85d64-370f-48b7-91ef-30ab8474bf6a\Project Collection Administrators.
---begin Exception entry---
Time: 2012-02-14T09:56:50
Module: Engine
Event Description: TF30162: Task "BuildTask" from Group "Build" failed
Exception Type: Microsoft.TeamFoundation.Client.PcwException
Exception Message: The file exists.
Exception Details:
Stack Trace:
at Microsoft.VisualStudio.TeamFoundation.Build.ProjectComponentCreator.ExecuteInternal(ProjectCreationContext context, XmlNode taskXml, Boolean validationOnly)
at Microsoft.VisualStudio.TeamFoundation.Build.ProjectComponentCreator.Execute(ProjectCreationContext context, XmlNode taskXml)
at Microsoft.VisualStudio.TeamFoundation.ProjectCreationEngine.TaskExecutor.PerformTask(IProjectComponentCreator componentCreator, ProjectCreationContext context, XmlNode taskXml)
at Microsoft.VisualStudio.TeamFoundation.ProjectCreationEngine.RunTask(Object taskObj)
-- Inner Exception --
Exception Message: The file exists.
(type BuildServerException)
Exception Stack Trace: at Microsoft.TeamFoundation.Client.TeamFoundationClientProxyBase.ProcessHttpResponse(HttpWebResponse response, Stream responseStream, WebException webException, XmlReader& xmlResponseReader)
at Microsoft.TeamFoundation.Client.TeamFoundationClientProxyBase.ExecWebServiceRequest(HttpWebRequest request, XmlWriter requestXml, String methodName, HttpWebResponse& response)
at Microsoft.TeamFoundation.Build.Client.BuildWebService.AddProcessTemplates(ProcessTemplate[] processTemplates)
at Microsoft.TeamFoundation.Build.Client.BuildServer.SaveProcessTemplates(IProcessTemplate[] processTemplates)
at Microsoft.VisualStudio.TeamFoundation.Build.ProjectComponentCreator.ExecuteInternal(ProjectCreationContext context, XmlNode taskXml, Boolean validationOnly)
Inner Exception Details:
Exception Message: The file exists.
(type SoapException)SoapException Details: <detail xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ExceptionMessage="The file exists.
" BaseExceptionName="System.IO.IOException" />
Exception Stack Trace:
--- end Exception entry ---
2012-02-14T09:56:50 | Module: Engine | Thread: 4 | TF30202: Task "" from Group "" will not be run because a prior task failed.
--------------------------------------------------
Thank you!
|
|
|
|
|
All,
This is a strange problem, I tried to find answer without success. The file I am tring to transmit is an xslx file.
I have the following piece of code that works fine when our employees/clients access our website from outside our network.
Response.ContentType = "application/vnd.ms-excel";
Response.ContentEncoding = System.Text.Encoding.Default;
Response.AppendHeader("Content-Disposition", "attachment; filename=" + newFile.Name.Replace(" ","_"));
Response.AddHeader("Content-Length", new System.IO.FileInfo(newFile.FullName).Length.ToString());
Response.TransmitFile(newFile.FullName);
HttpContext.Current.ApplicationInstance.CompleteRequest();
But when someone within our local network/office accesses this website I get the following error, "Unable to download xxxx from xxxx.com. Unable to open this Internet site. The requested site is either unavailable or cannot be found. please try again later."
I tried different approaches like adding Response.Flush() and Response.End() etc., nothing worked so far, I appreciate any help with this.
This only happens with IE, works fine in Chrome and Firefox, if this helps.
modified 14-Feb-12 12:24pm.
|
|
|
|
|
Hi,
I try to use SMO for backup from my network server. But it's giving error like "Backup Failed for server "1.1.1.10"...
Anybody can point me that where I have a mistake...from the below code...?
Thanks
<pre>ServerConnection Conn1 = new ServerConnection("1.1.1.10", "admin", "xxxxxxxxxx");
Backup Mybackup = new Backup();
Server srv = new Server(Conn1);
srv.ConnectionContext.LoginSecure = false;
srv.ConnectionContext.Login = "admin";
srv.ConnectionContext.Password = "xxxxxxxxxx";
srv.ConnectionContext.Connect();
Mybackup.Action = BackupActionType.Database;
Mybackup.Database = "Invoice_Master";
Mybackup.Devices.Add(new BackupDeviceItem("C:\\Temp\\CHECK\\MyInvoices.bak", DeviceType.File));
Mybackup.BackupSetName = "For_Bills";
Mybackup.SqlBackup(srv);
|
|
|
|
|
Does Sql Server have write-rights on that specific path? In other words, can you backup to there using the Management Studio?
Bastard Programmer from Hell
|
|
|
|
|
Thanks Eddy...
Yes...Its a mapped drive path...
Also I manually use to take the backup daily by the following manner.
backup database Invoice_Master to disk="C:\MyPath\BackupName.bak"
|
|
|
|
|