|
I'm not sure I understand the reason for the complexity. The final code fragment shows the use of the 'as' operator to perform a cast, implying that the type is known at compile time. If in fact all types are known then why use reflection at all, just go with is or as.
public void CastingCouch() {
List<ISomeInterface> someInstances = new List<ISomeInterface>();
someInstances.Add(new SomeClass<int>(100, 200));
someInstances.Add(new SomeClass<string>(200, "whoop de doo"));
someInstances.Add(new SomeClass<DateTime>(300, DateTime.Now));
foreach (ISomeInterface reference in someInstances) {
Console.Write("{0} ", reference.GetType());
if (reference is SomeClass<string>) {
Console.WriteLine("String");
} else if (reference is SomeClass<int>) {
Console.WriteLine("Int");
} else {
Console.WriteLine("Don't know");
}
}
}
Alan.
|
|
|
|
|
Alan, thanks for your suggestion ! I've edited my question to, I hope, more accurately show what I am looking for.
In many cases, what you propose is all that one needs; you could just as well have a Switch statement based on the Type Name to differentialy call whatever code you wanted based on Type at run-time.
However, in this case, there may be an unknown variety of instances using different generic Types because a 3rd. party is using the library. And, I am interested in seeing how one would achieve this, at minimal "cost."
cheers, Bill
«There is a spectrum, from "clearly desirable behaviour," to "possibly dodgy behavior that still makes some sense," to "clearly undesirable behavior." We try to make the latter into warnings or, better, errors. But stuff that is in the middle category you don’t want to restrict unless there is a clear way to work around it.» Eric Lippert, May 14, 2008
modified 30-May-16 14:43pm.
|
|
|
|
|
If you don't have a list of "known" types, how are you planning to use the "dereferenced" type? There's nothing you can cast it to other than object , which doesn't really give you anything interesting to play with.
Also, you existing code in #5 won't work if someone implements your interface in a different class:
class SomeOtherClass : ISomeInterface { ... }
class YetAnotherClass<TKey, TValue> : ISomeInterface { ... }
someInstances.Add(new SomeOtherClass(42));
someInstances.Add(new YetAnotherClass<NotTheTypeYoureLookingFor, TheDroids>());
You'd need more checks to ensure it's the expected type:
Type referenceType = reference.GetType();
if (referenceType.IsGenericType && referenceType.GetGenericTypeDefinition == typeof(SomeClass<>))
{
Type t = referenceType.GetGenericArguments()[0];
...
}
else
{
}
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Please provide the complete code if possible. That would be of great help.
Note:I am currently using Visual Studio 2012 and Excel 2013.
|
|
|
|
|
|
As Richard says, we are not a code-to-order service.
If you want someone to write your code, you have to pay - I suggest you go to Freelancer.com and ask there.
But be aware: you get what you pay for. Pay peanuts, get monkeys.
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
|
Hi,all:
I want to read Text File like:
123
456
789
...
Now i use readline() to read it. But really "789" is not "789", it can be "abc","def" or blank line,i don't know it. I hope when i finished read "456",i can try to read nextline,if it is not "789",i hope when i use nextline(), i can still can get this line.
|
|
|
|
|
The simplest way is to read all the lines at once:
string[] lines = File.ReadAllLines(pathToFile); You can just use a basic loop to access the lines in any order you need.
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
OK,thank you. But I want to use stream style to read,because my file content is big, i heard that stream is better when fil content is big.
|
|
|
|
|
Depends on the size. "Big" is a relative term!
Streaming isn't difficult either:
using (StreamReader read = new StreamReader(@"D:\Temp\MyBigFile.txt"))
{
while (read.Peek() >= 0)
{
string line = read.ReadLine();
}
}
But...unless your file is really, really big - like 250,000,000 lines plus - it's not necessarily going to be much more efficient than reading all the lines at once.
If you have to "go back" to lines, you can use
long pos = read.BaseStream.Position;
before each ReadLine to find out where in the file you are, and use Seek to go back there. But...remember that if you are storing the position of all lines, you can't store more than 250,000,000 on a 64 bit system, and 500,000,000 on a 32 bit system as there is an upper limit to the size of an array in .NET
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
OK,i Know,Thanke you very much
|
|
|
|
|
You're welcome!
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
This may or may not work depending on the version of the .NET framework.
It appears that at least up through .NET 4.5.1, the Position property of a FileStream returned only the information about how far the buffering had read.
namespace ConsoleApplication15
{
class Program
{
static void Main(string[] args)
{
using (System.IO.StreamReader reader = new System.IO.StreamReader(@"..\..\Program.cs"))
{
if (reader.EndOfStream)
return;
System.Console.WriteLine("Stream.Position = {0}", reader.BaseStream.Position);
}
System.Console.ReadLine();
}
}
}
This outputs:
Stream.Position = 455
(But looking at the 4.6.1 source code for FileStream , it appears that it will give the correct Position based on the actual read position.)
"Fairy tales do not tell children the dragons exist. Children already know that dragons exist. Fairy tales tell children the dragons can be killed."
- G.K. Chesterton
|
|
|
|
|
What you want to do, Read text file Line by line or at once, if you want to read it at once then you can refer a above solution given by OriginalGriff
if you want to read it line by line use below code
using System;
using System.IO;
class Program
{
static void Main()
{
foreach (string line in File.ReadLines("c:\\file.txt"))
{
Console.WriteLine("-- {0}", line);
}
}
}
Find More .Net development tips at : .NET Tips
The only reason people get lost in thought is because it's unfamiliar territory.
|
|
|
|
|
Um...that doesn't read it line by line - it reads them all and processes them line by line in a loop afterwards.
If you want to read line by line you need to loop on StreamReader.ReadLine instead.
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
Yes, basically it reads it at once but later split it by lines
Find More .Net development tips at : .NET Tips
The only reason people get lost in thought is because it's unfamiliar territory.
|
|
|
|
|
Then ,how can i do it use stream ? line by line? I found Peek() ,but only can read 1 char, i need try read 1 line.
|
|
|
|
|
use below code
const Int32 BufferSize = 128;
using (var fileStream = File.OpenRead(fileName))
using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, BufferSize)) {
String line;
while ((line = streamReader.ReadLine()) != null)
}
Find More .Net development tips at : .NET Tips
The only reason people get lost in thought is because it's unfamiliar territory.
|
|
|
|
|
A stream doesn't know about lines; a line-feed is a character. So, you reed 1 char, until you find a new-line character, then process.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
But you explicitly say "if you want to read it line by line use below code" - which it doesn't do!
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
I think you're confusing File.ReadLines[^] and File.ReadAllLines[^].
ReadAllLines reads all lines into memory and returns them as an array.
ReadLines returns an iterator that yields each line as it's read.
File.ReadLines is essentially the same as:
using (StreamReader reader = new StreamReader(path))
{
string line;
while ((line = reader.ReadLine()) != null)
{
yield return line;
}
}
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
|
It's not a programming problem, but one of mathematics. Find the mathematical solution; turning that into C# code should be easy.
|
|
|
|
|
The math forums are useless. They ask me to show how I'm solving it haha.
The point of my post is that I don't know how to solve it... otherwise I wouldn't be asking for help lmao
|
|
|
|