Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I'm refactoring some of our old code, I'm replacing our old status images as Font Awesome Icons.

We have a method that creates an image and returns it, for dynamically adding controls to a page.

Old Code

  return new Image {
      ImageUrl = SomeConstURL,
      ToolTip = tooltip
  };

New Code

  return new HtmlGenericControl
  {
      InnerHtml = IconFactory("fa-circle", UnacceptableIconClass, "fa-2x"),
      Attributes = { Keys = tooltip}
  };

When I use the above new code I get the error:

Error 638 Property or indexer 'Keys' cannot be assigned to -- it is read only

It's a straight forward error, it's read only, I can't assign it that way.

I've done it in the past with:

someIcon.Attributes["title"] = "My tooltip text";

However when I try and do the same inside the initializer:

new HtmlGenericControl
     Attributes["title"] = "My tooltip text"
}

I get the error:

Invalid initializer member delcarator

I just have no idea how to do this in the initializer.

I've looked at the docs for HtmlGenericControl

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
436 views
Welcome To Ask or Share your Answers For Others

1 Answer

Object initializer syntax is like this:

new Type
{
    SettableMember = Expression
    [,SettableMember2 = Expression2]...
}

Where SettableMember needs to be a settable member. Formally, in the C# specification:

Each member initializer must name an accessible field or property of the object being initialized

So you can't do this in one go, as Attributes is a read-only property of a type with an indexer. You need to access the indexer separately, as an indexer access of a property P of class C isn't a member access of class C and thus invalid in an object initializer:

var control = new HtmlGenericControl
{
    InnerHtml = IconFactory("fa-circle", UnacceptableIconClass, "fa-2x"),   
};

control.Attributes["title"] = "My tooltip text";

return control;

Were Attributes settable and AttributeCollection easily constructable, you'd be able to assign it:

var control = return new HtmlGenericControl
{
    InnerHtml = IconFactory("fa-circle", UnacceptableIconClass, "fa-2x"),   
    Attributes = new AttributeCollection
    {
        { "title", "My tooltip text" }
    },
};

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...