|
glFrustum wrote: I'm looking for a nicer way to invoke methods. The following code is called by:
Fetch(someObject, "GetCustomer", 1).
The ugly thing about this is that the name of the method is passed as a string. Is there a way to support something like:
Fetch(someObject.GetCustomer, 1)?
Im still searching for the reason why you think the latter is preferable to the former. In answer to your question, if all the methods you want to call from your Fetch method have the same signature you could use delegates insstead of reflection (which identifies methods/properties the same way you do - by name).
eg. Say this is a data layer you are writing and the Fetch method is responsible for getting data from a vasiety of methods which follow this signature:
DataSet SomeGetDataMethod(object [] parameters)
you would define a delegate along the lines of
public delegate DataSet GetDataDelegate(object[] parameters);
You would then define your Fetch method as follows
public DataSet Fetch(GetDataDelegate method, object[] parameters)
{
method.Invoke(parameters);
}
Then to call this method you could have:
object[] parameters = new object{ 1 };<br />
Fetch( new GetDataDelegate(someObject.GetCustomer), parameters)
you could then pass a delegate to any of your data methods into this fetch method without using reflection.
Personally id stick with reflection!
|
|
|
|
|
Thanks for the feedback. I'd prefer the latter, because the string could cause troubles (renaming of methods etc.).
Also, using
someDelegate.DynamicInvoke(args)
could be faster than
target.GetType().InvokeMember(methodName, BindingFlags.InvokeMethod, null, target, args); .
The problem is that the methods do not have similar signatures and I don't know how to implement a generic delegate that can handle all types of signatures (if this is even possible...).
Please let me know if you have any idea...
thx
|
|
|
|
|
glFrustum wrote: I don't know how to implement a generic delegate that can handle all types of signatures (if this is even possible...).
Its not.
|
|
|
|
|
One step into the right direction, at least for one argument:
<br />
public delegate object GenDel<T>(T t);<br />
...<br />
GetCustomerRequest args = new GetCustomerRequest(1, 2, 3);<br />
GenDel<GetCustomerRequest> del = new GenDel<GetCustomerRequest>(repository.GetCustomer);<br />
Customer c = (Customer)Fetch(del, args);<br />
...<br />
public object Fetch(Delegate del, params object[] args)<br />
{<br />
return del.DynamicInvoke(args);<br />
}<br />
<br />
Thanks a lot for the tips so far...
|
|
|
|
|
Hi..
I am developing one console application in C#.net, in which i want to split one big excel file having more than 50000 records in to 10 smaller files. Can you guide me to perform this task?
Waiting for reply.
Thanks.
Gurudatta B. Shelke
|
|
|
|
|
Use the OLEDB provider to read all the data into a datatable. Then, split the total rows how you want them, use the office interop to write the first set of rows to the specified file, and move on to the next.
user != use
I get all the news I need from the weather report - Paul Simon (from "The Only Living Boy in New York")
|
|
|
|
|
thanks for giving me the solution.
I have read the excel sheet into dataset using OLEDB provider. Now i m not getting how can i split into multiple excel files.
Do u have sample code regarding this?
Gurudatta B. Shelke
|
|
|
|
|
I don't have any code to give you, as I have never done that.
What I would do is:
1)get the total number of rows from your main table(the table you load all of your data into)
2)then create a worktable for storing rows to be written to a file.
3)create an integer(lets call this IHAVETOPEE), and divide the number of total rows by 10, and drop the remainder.
4)do a for loop to the number of total rows.
5)create a counter(iCounter) to record how many rows have been copied to the worktable, and written to file.
6)loop through, adding the current row to the worktable, and when the loop becomes == to IHAVETOPEE, write the worktable to file, and clear the worktable.
7)create an if statement for when the for loop is on it's last round
8)subtract the counter from totalRows
9) Inside the if statement, have another for loop, that will loop from the current row, to the total rows, and when the loop reaches the # from step 8, write to file
All of that will write to 10 files, evenly over all, plus a couple on the last file, because surely you will end up with a number of rows like 1983 some time
Hope that was clear
I get all the news I need from the weather report - Paul Simon (from "The Only Living Boy in New York")
|
|
|
|
|
Datagridview rows transfer to one datagridview to another datagridview how?
|
|
|
|
|
//dataGridView1 is empty
//gridviiew2 is filled with data
//Bind gridviiew1 with data from dataGridView2 by seting DataSourceID to
dataGridView1.datasourceid = dataGridView2.datasourceid;<br />
dataGridView1.DataBind();
I Love SQL
|
|
|
|
|
Hi Everybody,
While sending the message to the message queue I am getting the following error can any one tell me a solution to rectify it.
at System.Messaging.MessageQueue.ResolveFormatNameFromQueuePath(String queuePath, Boolean throwException)<br />
at System.Messaging.MessageQueue.get_FormatName()<br />
at System.Messaging.MessageQueue.SendInternal(Object obj, MessageQueueTransaction internalTransaction, MessageQueueTransactionType transactionType)<br />
at System.Messaging.MessageQueue.Send(Object obj)<br />
at Versatile.Services.EventScheduler.EventSchedulerService.ScheduleEvents(String status, DateTime eventFromDate, DateTime eventToDate) in c:\Projects\Versatile\Versatile\Versatile.Services.EventScheduler\EventScheduler.cs:line 420
I have created the message queue as follows:
eventMessageQueue = System.Messaging.MessageQueue.Create(System.Net.Dns.GetHostName() + <br />
@"\MyEventQueue");
Instantiated as follows:
eventMessageQueue = new MessageQueue(System.Net.Dns.GetHostName() + @"\MyEventQueue");
Best Regards,
M. J. Jaya Chitra
|
|
|
|
|
What error are you actually getting? This is just a stack trace and doesn't tell us much.
Were you, by any chance, getting a Queue does not exist or you do not have permission error?
Deja View - the feeling that you've seen this post before.
|
|
|
|
|
I checked for the permissions and i tried the same in an simple sample program also it is working fine. Where can i see the error message which will give us complete details.
The queue is also exists.
Best Regards,
M. J. Jaya Chitra
|
|
|
|
|
I believe you are not passing enough into into your create of your message queue. This is the code I use when I use the messagequeue.
new MessageQueue(FormatName:DIRECT=OS:"ServerNameHere"\Private$\"Queuenamehere");
So you need to say if the queue is Public or Private.
Hope that helps.
Ben
|
|
|
|
|
Thank you for your kind and timely help
It is public queue What is the purpose of the FormatName:Direct=OS
If i am specifying the format it is giving some error.
Please help me
Best Regards,
M. J. Jaya Chitra
|
|
|
|
|
FormatName is one of the options when creating a messagequeue. I have had the best luck with it, so that is what I use.
Ben
|
|
|
|
|
Still my error is not rectified please give me the code to create the message queue or else give me some references.
Best Regards,
M. J. Jaya Chitra
|
|
|
|
|
I guess I would need more detail to understand your program to try to help more.
You are trying to put a message on a queue that is on a different computer then the one your program is running on? Or are they on the same computer?
If you are going to a different computer, you need to make sure the user will have rights on the other computer. Although, almost anyone should be able to put a message on the queue if you have a public queue.
Looking at your error message again. It looks like it is not able to resolve the name to the queue. NOrmally I have saved queue names in a web.config or app.config file. I am not sure what is coming back from your call to:
System.Net.Dns.GetHostName()
if there are slashes \\ then they need to be removed.
Hope that helps.
Ben
|
|
|
|
|
Hai Ben,
Warm Greetings!
Thank you for your kind reply.
kubben wrote: System.Net.Dns.GetHostName()
if there are slashes \\ then they need to be removed.
It is giving only the system name without any slashes.
It i want to store it in the app.config file how can i perform this.
Can you please give me the code to create and instantiate the queue and send message to the queue.
Please i don't want the full coding but i want to know it clearly so only i am asking you it is very very urgent.
Best Regards,
M. J. Jaya Chitra
|
|
|
|
|
One more thing to check and then I will give you the code I use. The queue name is case sensitive. So whatever you created the queue name to be that is what it needs to be in your code.
Ben
|
|
|
|
|
Ok here is the code:
//outbound queue
String outQueue = ConfigurationSettings.AppSettings["outboundQ"].ToString();
// using formatname we cannot check if the queue exists.
_outboundQueue = new MessageQueue(outQueue);
//config file:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<!-- Queues must be named "FormatName:DIRECT=OS:<machineName>\Private$\queueName" -->
<add key="outboundQ" value="FormatName:DIRECT=OS:server01\Private$\Importer.Inbound" />
Hope that helps.
Ben
|
|
|
|
|
Dear Ben,
Thank you lot for helping me to rectify the error.
I have fixed up the issue and it is working fine.
Once again thank you a lot.
Best Regards,
M. J. Jaya Chitra
|
|
|
|
|
Glad you figured it out.
Ben
|
|
|
|
|
I have simple project and i can't access serial port (RS232) using C#.NET, could somebody help me to give a simple example code ?
thanks
suprapto
|
|
|
|
|