|
Why would you suppose that it wasn't?
|
|
|
|
|
I didn't just post some random question for the sake of posting.
I have a situation where I can call the method with or without the enum.
If it's not broken, fix it until it is
|
|
|
|
|
It usually helps to describe the problem, rather than posting a cryptic one-line summary.
Are you calling a method with an optional parameter? If so, any call which omits the optional parameter will automatically pass the declared default value:
void SomeMethod(SomeEnum theParameter = SomeEnum.Default) { ... }
SomeMethod();
If you're not using an optional parameter, you'll need to provide more information.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
I posted "How do you tell IF an enum was passed as a parameter?"
Therefore, it should be clear that it is indeed an optional parameter. Not sure how that's "cryptic".
But yes, I want to be able call the method with or without the enum. Getting the default value doesn't help as there's still no way to kow if it was passed or not.
If it's not broken, fix it until it is
|
|
|
|
|
It may be obvious to you, but you wrote the question. Your question made no sense to me either.
|
|
|
|
|
Sorry, most of us wear foil hats to prevent the government from reading our minds. This has the unfortunate side-effect of blocking our own telepathic abilities.
Your original question, "How do you tell if an enum was passed as a parameter?", might have been obvious to you, but judging by the responses you've received, it's not as obvious to other people as you might think. If you'd asked, "I have a method with an optional parameter; how can I tell whether or not the caller passed the parameter?", or included a small code snippet, we'd have had a better chance of understanding what you were asking.
To answer your question, there's no way to tell the difference between code which didn't pass the optional parameter and code which passed the default value for the optional parameter. The compiler generates exactly the same code for both.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Kevin Marois wrote: it should be clear that it is indeed an optional parameter
I hadn't even considered it might be; I never user optional parameters.
Sounds like you want an overload instead. Come on, go olde school.
|
|
|
|
|
That's difficult to answer without knowing the signature of the method you are talking about.
if the sig is:
void MyMethod(MyEnum me) {} Then it is safe to say that me contains an enum value.
it it is:
void MyMethod(int i) {} Then it could be an enum, since they are integer values.
If you mean "Can I find out if an object was an enum?" then:
enum xx
{
v1, v2
}
void MyMethod(object o)
{
Console.WriteLine(o);
if (o is xx) Console.WriteLine("XX");
if (o is int) Console.WriteLine("INT");
}
void TryIt()
{
int i = 13;
xx x = xx.v2;
MyMethod(i);
MyMethod(x);
MyMethod((int)x);
}
Will print:
13
INT
v2
XX
1
INT
If you get an email telling you that you can catch Swine Flu from tinned pork then just delete it. It's Spam.
|
|
|
|
|
No, I'm not passing an int. I'm passing the actual enum value, as in
void MyMethod(bool var1, MyEnum theEnum)
{
}
then I want to either call it as
MyMethod(true);
or
MyMethod(true, MyEnum.TheValue);
So I want to determine of the enum was passed.
If it's not broken, fix it until it is
|
|
|
|
|
Depends on which version of .NET you are using.
.NET 4 introtuced Optional Parameters:
enum MyEnum
{
DefaultValue,
v1, v2
}
void TryIt()
{
MyMethod(true, MyEnum.v1);
MyMethod(false);
}
void MyMethod(bool var1, MyEnum theEnum = MyEnum.DefaultValue) { Console.WriteLine(theEnum); }
Before that, you could use params :
void MyMethod(bool var1, params MyEnum[] theEnum) { Console.WriteLine(theEnum); }
Which is a lot nastier.
If you get an email telling you that you can catch Swine Flu from tinned pork then just delete it. It's Spam.
|
|
|
|
|
Ya I'm in 3.5. So far I'm passing a bool to indicate if the enum was passed. Seems like there's no easy way.
If it's not broken, fix it until it is
|
|
|
|
|
You could set the parameter to params MyEnum[] enums :
enum MyEnum
{
DefaultValue,
v1, v2
}
void TryIt()
{
MyMethod(MyEnum.v1);
MyMethod();
}
void MyMethod(params MyEnum[] theEnum)
{
if (theEnum.Length == 1)
{
Console.WriteLine(theEnum[0]);
}
else if (theEnum.Length > 1)
{
throw new ArgumentException("Too many parameters");
}
}
But it is ugly and relies on run time checking which is dangerous at best.
Is there anything stopping you from just declaring two overloads?
void MyMethod() { }
void MyMethod(MyEnum theEnum) { }
If you get an email telling you that you can catch Swine Flu from tinned pork then just delete it. It's Spam.
|
|
|
|
|
OK, now we're getting somewhere!
Rather than passing a separate bool flag, you can use a nullable type[^] to pass your enum:
void SomeMethod(SomeEnum? theEnum)
{
if (theEnum.HasValue)
{
switch (theEnum.Value)
{
case SomeEnum.Item1:
{
...
}
}
}
else
{
}
}
SomeMethod(SomeEnum.Item1);
SomeMethod(null);
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
modified 18-Dec-12 15:08pm.
|
|
|
|
|
How silly. I don't see what all the confusion is about. Just do it the "standard" way.
enum eType
{
None = -1,
Enum1 = 0,
Enum2 = 1,
etc.
}
void SomeMethod()
{
SomeMethod(eType.None);
}
void SomeMethod(eType e)
{
}
|
|
|
|
|
According to MSDN[^]:
A procedure cannot detect at run time whether a given argument has been omitted or the calling code has explicitly supplied the default value
You have a few choices. You can overload the method and have a private one with a bool flag:
public void Method()
{
Method(true, 0);
}
public void Method(YourEnum yourEnum)
{
Method(false, yourEnum);
}
private void Method(bool ignoreEnum, YourEnum yourEnum)
{
if(ignoreEnum)
{
}
else
{
}
}
You can use nullable as suggested in an answer above.
You can add a value to the enum Invalid = -1 and use that as the default parameter value.
|
|
|
|
|
< Insert scatalogical humor >
|
|
|
|
|
Hello,
I'm currently developing an Integration Package for VS 2010. When I'm debugging the project, it does normally start an experimental hive that includes my package.
My problem: Changes in *.vsct file does not have an effect on the loaded package [at the hive]. Changes in .cs files are accepted normally to the hive package after debug.
The way I found to fix this is to reinstall the package in the hive, but this is definitly no suitable solution.
Thanks for help.
|
|
|
|
|
here is the aspx code for my page
<asp:GridView ID="examgrid" runat="server" AutoGenerateColumns="false"
AllowPaging="true" OnPageIndexChanging="examgrid_pageindexchanging"
onrowdatabound="examgrid_RowDataBound">
<Columns>
<asp:TemplateField HeaderText="Exam">
<ItemTemplate>
<asp:Label ID="quesname" runat="server" Text='<%Eval(Ques_Name) %>'></asp:Label>
<br />
<asp:RadioButton ID="op1" runat="server" Text='<%Eval(Option1) %>' /><br />
<asp:RadioButton ID="op2" runat="server" Text='<%Eval(Option2) %>' /><br />
<asp:RadioButton ID="op3" runat="server" Text='<%Eval(Option3) %>' /><br />
<asp:RadioButton ID="op4" runat="server" Text='<%Eval(Option4) %>' /><br />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
can any tells me how do i can show the values from database into radio buttons and in label which is reside into gridview in a single column
i use that code in c#
for (int i = 0; i <= dt.Rows.Count - 1; i++)
{
string ques = dt.Rows[i][0].ToString();
string opt1 = dt.Rows[i][1].ToString();
string opt2 = dt.Rows[i][2].ToString();
string opt3 = dt.Rows[i][3].ToString();
string opt4 = dt.Rows[i][4].ToString();
examgrid.Rows[i].Cells[0].Text = ques;
RadioButton op1 = (RadioButton)examgrid.FindControl("op1");
RadioButton op2 = (RadioButton)examgrid.FindControl("op2");
RadioButton op3 = (RadioButton)examgrid.FindControl("op3");
RadioButton op4 = (RadioButton)examgrid.FindControl("op4");
op1.Text = opt1;
op2.Text = opt2;
op3.Text = opt3;
op4.Text = opt4;
}
but in tht code radio shows null each one,
can anyone help me in it
modified 18-Dec-12 8:04am.
|
|
|
|
|
You may get a better chance of help in the ASP.NET forum.
One of these days I'm going to think of a really clever signature.
|
|
|
|
|
Hey guys,
Long story short:
I have a number of classes that are structured like this:
class ClassA
{
[WantToCopy]
public Property1 { get; set; }
public Property2 { get; set; }
}
class ClassB : ClassA
{
public Property1 { get; set; }
public Property2 { get; set; }
}
class ClassC
{
public ClassB { get; set; }
public Property1 { get; set; }
public Property2 { get; set; }
}
I am trying copy the ClassA values (marked with a specific attribute) from an instance of ClassB to a new instance of ClassA.
This is what I am doing:
T resp = GetClassC();
var types = resp.GetType().GetProperties();
foreach (var type in types)
{
if(type.PropertyType.IsSubclassOf(this.GetType()))
{
List<PropertyInfo> fields = GetFields(type.PropertyType);
foreach (var field in fields)
{
var value = field.GetValue(resp , null);
field.SetValue(this, value , null);
}
}
}
The problem is I get a TargetException when I try and get a ClassA value from a ClassC instance (which makes sense).
ClassC is a generic type. I don't know anything about the ClassB member.
Does anyone have any tricks that could help me out here? Or will I have to use an interface?
P.S I am keen to keep this code to <= .NET 3.5 if possible.
Thank you,
Mark
Mark Brock
"We're definitely not going to make a G or a PG version of this. It's not PillowfightCraft." -- Chris Metzen
|
|
|
|
|
You're trying to read the value of a property defined in ClassA from an instance of ClassC , which doesn't inherit from ClassA .
Try something like this instead:
Type myType = this.GetType();
List<PropertyInfo> propertiesToCopy = GetFields(myType);
foreach (PropertyInfo property in resp.GetType().GetProperties())
{
if (property.PropertyType.IsSubclassOf(myType) || property.PropertyType == myType)
{
var propertyValue = property.GetValue(resp, null);
if (propertyValue == null) continue;
foreach (PropertyInfo propertyToCopy in propertiesToCopy)
{
var value = propertyToCopy.GetValue(propertyValue, null);
propertyToCopy.SetValue(this, value, null);
}
}
}
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Thanks Richard that looks like it will do what I am trying to achieve, cheers mate!
Mark Brock
I'm pretty sure there's a lot more to life than being really, really, ridiculously good looking
|
|
|
|
|
As you seem to have access to the code, why not add a copy constructor or Clone method to ClassA?
|
|
|
|
|
Thanks for your response. That is a good suggestion, but in this particular case I am trying to avoid using that approach.
Much appreciated anyway
Mark Brock
I'm pretty sure there's a lot more to life than being really, really, ridiculously good looking
|
|
|
|
|
hi.i want make a report that have 60 filed.and its very hard to me for make report in crystal report in one page,please help me to make several pages in crystal report.
|
|
|
|